次の単純な関数について考えてみます。
f <- function(x, value){print(x);print(substitute(value))}
引数x
は最終的にによって評価されますprint
が、value
決して評価されません。したがって、次のような結果を得ることができます。
> f(a, a)
Error in print(x) : object 'a' not found
> f(3, a)
[1] 3
a
> f(1+1, 1+1)
[1] 2
1 + 1
> f(1+1, 1+"one")
[1] 2
1 + "one"
期待通りのすべて。
ここで、置換関数で同じ関数本体を検討します。
'g<-' <- function(x, value){print(x);print(substitute(value))}
(一重引用符は派手な引用符である必要があります)
試してみよう:
> x <- 3
> g(x) <- 4
[1] 3
[1] 4
これまでのところ珍しいことはありません...
> g(x) <- a
Error: object 'a' not found
これは予想外です。名前a
は言語オブジェクトとして印刷する必要があります。
> g(x) <- 1+1
[1] 4
1 + 1
x
の以前の値はですので、これは問題ありません4
。式が未評価で渡されたことに注意してください。
最終テスト:
> g(x) <- 1+"one"
Error in 1 + "one" : non-numeric argument to binary operator
ちょっと待ってください...なぜこの式を評価しようとしたのですか?
問題は、バグか機能かということです。ここで何が起こっているのですか?一部の教祖ユーザーがRの約束と遅延評価について光を当ててくれることを願っています。あるいは、それはバグであると結論付けるかもしれません。