Рассмотрим следующую простую функцию:
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
Подождите минуту... Почему он попытался оценить это выражение?
Хорошо, вопрос: ошибка или функция? Что здесь происходит? Я надеюсь, что некоторые пользователи гуру прольют некоторый свет о promises и ленивую оценку на R. Или мы можем просто сделать это ошибкой.