関数の引数は遅延評価されるから、その関数のなかで生成する変数でデフォルト引数を定義することさえできてしまう。良いやり方ではないけれど。関数にデフォルト値を与えず、未指定かどうかmissing()で調べてどうにかするコードを書くくらいなら、デフォルト値をNULLにしておいてis.null()で調べたほうが良いのでは、とのこと。どれが必須変数でどれが省略可能な変数かわかりにくくなるから。null")と軽く書けるのは遅延評価のおかげ。逆に言うと、いつもこういうとき||演算子を使わずstopifnot(!is.null(x))と書いているのは、気持ちの上で遅延評価に頼るのが怖いからだと気が付いた。オブジェクト指向実践ガイドis.object()でオブジェクトが基本型かどうかがわかる。わかりにくい名前だ...S3クラスをすべて表示させる方法はない。S3オブジェクトのclass属性を変えることができる、変えるべきではないけれど、とのこと。いわれてみれば、あまり気にしていなかったけど、オブジェクト指向という意味ではclass属性を変えられるのってすごく奇妙ですね。環境この章がいちばん難しい。理解できたとは言い難い。環境はフレームと親環境からなる。フレームとは名前と束縛を保存しているものである。ところがフレームという用語は別の意味で使われていることがある。parent.frame()は親フレームではなくて呼び出し環境にアクセスしている。リストの要素にNULLを付値すればその要素は消えるが、環境のなかのオブジェクトにNULLを付値してもNULLに束縛されるだけ。いわれてみればそうだ。削除にはrm()を使う。大きなデータを扱うために環境を使った。修正してもコピーが生じないから。いまではリストを修正しても全要素をコピーしたりしないので、あんまり意味がなくなった。いつもtry()の返値の判定で戸惑っていたのである。防御的プログラミングの観点からは、subset()は使わないほうがよい(非標準評価しているから)。[とsapply()には要注意(引数によって出力の型が変わるから)。[にはdrop=FALSEを付け、sapply()のかわりにvapply()を使うべし。withCallingHandlers()について説明しているんだけど、面倒なのでスキップした。持っている値をみるためには、as.list(environment(c))とするか、pryr::unenclose(c)を使う。入れ、それぞれにオブジェクトxを食わせて動かしまくりたいとする。名前付き関数を作るしかない。f(x))というように。ああ、やっぱりそうだったのか。なにか特別なやり方があるのかと思っていた。関数を食ってベクトルを返す関数を汎関数(functional)という。lapply()がそう。mtmeans)としたほうがわかりやすいでしょう、とのこと。私はふだんMap()使わないのでびびりました。a1)はFALSEになる(a1はaの転置になっているから。identity)ならTRUEになる)。apply()のこういう性質のことを「べき等性がない」というのだそうだ。Reduce()関数。数値ベクトルのリストlがあり、全要素に共通する値を探したい。l[[2]]])をとって、それとl[[3]]とのintersectをとって...を繰り返したい。