Non-standard evaluation · Advanced R.
例にあがってるここで、なぜsubstitute
なのかよくわからなかったので調べてみたときのメモです。
subset2 <- function(x, condition) { condition_call <- substitute(condition) r <- eval(condition_call, x) x[r, ] }
quote
まず、この例の上で紹介されている関数はquote
です。
これは、引数をそのままcall
というクラスにして返す関数です。
> quote(1+1) 1 + 1 > class(quote(1+1)) [1] "call
call
はeval
を使うと評価されます。
> eval(quote(1+1)) [1] 2
では、ここに変数が入っていた場合はどうなるかというと、
> eval(quote(1+x)) Error in eval(expr, envir, enclos) : object 'x' not found > x <-1 > eval(quote(1+x)) [1] 2
もちろんエラーになります。
しかし、x
が.GlobalEnv
にあると、それを評価してくれます。
substitute
substitute
も、基本的にはquote
と変わりません。
> substitute(1+1) 1 + 1 > class(substitute(1+1)) [1] "call"
ではquote
と何が違うかというと、2つ目の引数で環境を指定できることです。
> substitute function (expr, env) .Primitive("substitute")
例えば、もう少し上の例であったplus_one
は、別の環境を持っています。
> plus <- function(x) { + function(y) x + y + } > plus_one <- plus(1) > environment(plus_one) <environment: 0x000000000d47ce08>
これをsubstitute
の第二変数に指定すると、
x
を、environment(plus_one)
にあるx
の値に置き換えたうえで、callオブジェクトを返してくれます。
> substitute(1+x, environment(plus_one)) 1 + 1
なるほどなー、と思ったのでメモでした。