R in a Nutshell(R in a Nutshell - O'Reilly Media)のiPhoneアプリ版を買ってぼちぼち読んでるのですが,読んだそばから忘れる&後から参照がしにくいので気になった部分をメモしていくことにしました.
あくまで気になった部分なので特に実用的ではないかもしれません.それとあまり辞書を引かずに流し読みしてるので誤読してボケたことを書いている場合もあるかもしれません.そういう箇所を見つけたらこっそり教えてください.
if文
if文の条件式にベクトルを使用することはできない.
例えばconditionの真偽に応じてaとbのベクトルから要素を各々選択したいとする.
これはif文では無理だが…
> a <- c( 1, 2, 3, 4, 5) > b <- c(11,22,33,44,55) > condition <- c(T, F, T, F, T) > if (condition) a else b [1] 1 2 3 4 5 警告メッセージ: In if (condition) a else b : 条件が長さが2以上なので,最初の一つだけが使われます
ifelse()関数を使えば条件にベクトルを渡せるので簡単に実現できる.
> ifelse(condition, a, b) [1] 1 22 3 44 5
添字の指定に名前を使うときのexact=FALSEオプション
ベクトルやリストの要素をその名前によって指定する場合,通常は名前を完全に指定する必要がある.
> names(x) <- c("ho", "ge", "hoge", "hogehoge", "gegege") > x["hoge"] hoge 3 > x["hogeho"] <NA> NA
しかし,添字を指定する括弧にダブルブラケットを使用し,かつ単一の要素を指定する場合はexact=FALSEオプションを指定することで途中まで入力した名前で要素を指定できるようになる.
> x[["hogeho"]] 以下にエラー x[["hogeho"]] : 添え字が許される範囲外です > x[["hogeho", exact=FALSE]] [1] 4
遅延評価
Rインタプリタが式を評価するとき,全てのシンボルが評価される.
つまり,オブジェクトをシンボルから組み立てる際,全てのシンボルはオブジェクト作成時に評価され,後から組み立てに用いたシンボルをどう変更しようがオブジェクトの要素には影響が及ばない.
> x <- 1 > y <- 2 > z <- 3 > a <- c(x, y, z) > a [1] 1 2 3 > y <- 10 > a [1] 1 2 3
シンボルが評価されるのを防ぎたければ遅延評価を用いる.
評価したくない式をquoteで囲んでおいて,必要になったらevalで明示的に評価する.
> x <- 1 > y <- 2 > z <- 3 > a <- quote(c(x, y, z)) > eval(a) [1] 1 2 3 > y <- 10 > eval(a) [1] 1 10 3
また,delayedAssign()関数を用いてpromiseオブジェクトを作製することもできる.
promiseオブジェクトはそれが必要になったとき初めてシンボルを評価する.そのため,オブジェクトが呼び出されるまでシンボルを自由に変更できる.
> x <- 1 > y <- 2 > z <- 3 > delayedAssign("a", c(x, y, z)) > y <- 10 > a [1] 1 10 3
必要とされるまでデータをメモリに読み込むこと無くオブジェクトを作製できるので,パッケージを作製するような場合に便利らしい.
そのオブジェクトがpromiseオブジェクトか否かを判断する術はない.
Global Environmentの親環境の一覧表示
> x <- .GlobalEnv > while (environmentName(x) != + environmentName(emptyenv())){ + print(environmentName(parent.env(x))) + x <- parent.env(x) + } [1] "package:stats" [1] "package:graphics" [1] "package:grDevices" [1] "package:utils" [1] "package:datasets" [1] "MacJapanEnv" [1] "package:methods" [1] "Autoloads" [1] "base" [1] "R_EmptyEnv"
R_EmptyEnv以外の全ての環境は親環境を持っている.