метапрограммирование и функция замены в R - PullRequest
3 голосов
/ 25 июня 2019
f <- function() {
  x <- 6 + 4
  substitute(x)
}
f()

Выше будет выводиться:

[1] 10

Тем не менее, ниже:

x <- 6 + 4
substitute(x)

выходы:

x

Почему они разные?

Ответы [ 2 ]

4 голосов
/ 25 июня 2019

@ ответ Акруна демонстрирует , как разрешить его, но я думаю, что ответ на ваш вопрос " Почему?" находится в ?substitute где говорится в деталях:

Если это обычная переменная, ее значение подставляется, , если env не равно .GlobalEnv, в этом случае символ остается неизменным.

(Выделение мое.) Когда вы выполняете это в приглашении по умолчанию >, вы находитесь в глобальной среде. Не так в вашем первом примере, внутри пространства имен функции. (Что касается «Почему R-core выбрал такое поведение?» , я не думаю, что я квалифицирован, чтобы отвечать или даже строить предположения.)

1 голос
/ 25 июня 2019

eval не происходит

eval(substitute(x))
#[1] 10

Поскольку @ r2evans показал описание документации, мы можем протестировать его в новой среде, чтобы увидеть это в действии

# create the object in another environment
e1 <- new.env()
e1$x <- 6 + 4
substitute(x) # here x is looked in the global space
#x
substitute(x, env = e1) # specify the `env` and looks for the local env
#[1] 10
...