Непонятное поведение "заменителя" в R - PullRequest
6 голосов
/ 02 ноября 2010

Ребята, это сводит меня с ума.

Это работает как ожидалось:

eobj <- substitute(obj <- list(a, b), list(a = 32, b = 33))
eval(eobj)
obj
[[1]]
[1] 32

[[2]]
[1] 33

Теперь попробуйте это:

efun <- substitute(fun <- function() a+ b, list(a = 32, b = 33))
str(efun)
# language fun <- function() 32 + 33  
eval(efun)
fun
# function() a+ b

Что здесь происходит?Как, черт возьми, eval получить его руки в первоначальной форме выражения?

1 Ответ

8 голосов
/ 02 ноября 2010

Причина, когда вы печатаете fun, это фактически источник печати функции (см. attributes(fun)), который не изменяется substitute.

Обратите внимание, что когда вы определяете a или b в функции глобальной рабочей области, результат остается тем же.

Вы можете увидеть действительный код функции по body(fun).

Или сравнить:

print.function(fun, useSource=FALSE)
# function () 
# 32 + 33
print.function(fun, useSource=TRUE) # Which is default
# function() a+ b
...