R eval (): изменено поведение, когда аргумент 'envir' явно установлен на значение по умолчанию - PullRequest
0 голосов
/ 12 декабря 2018

Рассмотрим функцию fun1().При вызове не присваивается значение 2 xx в .GlobalEnv.

fun1 <- function(x) eval(expr=substitute(x)) 
fun1({xx <- 2; xx})
## [1] 2
xx
## Error: object 'xx' not found

Значение по умолчанию для аргумента envir из eval():

formals(eval)$envir
## parent.frame()

В fun2() для аргумента envir явно установлено значение по умолчанию parent.frame().При вызове fun2() присваивается значение 2 xx в .GlobalEnv.

fun2 <- function(x) eval(expr=substitute(x), envir=parent.frame())
fun2({xx <- 2; xx})
## [1] 2
xx
## [1] 2

(протестировано с версией R 3.5.0)

Почему это так?Это поведение предназначено?

1 Ответ

0 голосов
/ 12 декабря 2018

Значения по умолчанию для функций оцениваются в кадре оценки функции.Явные аргументы оцениваются в кадре вызова.(Оба из них могут быть изменены нестандартными приемами оценки, но вы их не используете.)

Итак, в вашем первом примере parent.frame() является родителем вызова eval(), т.е.оценка кадра fun1().Во втором примере parent.frame() является родителем вызова fun2().

...