Вопрос

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

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

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 Получает в себя руки на оригинальную форму выражения?

Это было полезно?

Решение

Потому что при печати 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top