在 R 中,可以在执行一段代码之前进行“宏替换”。使用这种技术,可以在实际创建函数之前将常量动态嵌入到函数体中,从而避免变量查找:
expr = substitute(function () s, list('s'='ABCDE'))
f = eval(expr)
f()
# [1] "ABCDE"
environment(f)
# <environment: R_GlobalEnv>
这里的封闭环境是R_GlobalEnv
,其中不包含变量 s
完全没有,但该函数仍然可以返回 "ABCDE"
正确。这似乎意味着返回的字符串 "ABCDE"
确实不是来自变量查找,而是嵌入到函数体中。但是现在如果你打印函数,你可以看到
s
仍然存在,尽管它不在 expr
中:print(f)
# function () s
print(expr)
# function() "ABCDE"
这里到底发生了什么?
最佳答案
print.function
打印 srcref
属性而不是实际来源,但
useSource=
参数可用于指定要使用的实际函数源。它默认为 TRUE,但可以指定为 FALSE。 body(f)
将显示实际的 body 。 attr(f, "srcref") <- NULL
删除在这种情况下,print 将显示实际来源。也可以覆盖 srcref 属性。 attr(f, "srcref") <- format(f)
之所以有效是因为 format
使用实际来源。 这是一个演示。
expr <- substitute(function () s, list('s'='ABCDE'))
f <- eval(expr)
f
## function () s
print(f)
## function () s
print(f, useSource = FALSE)
## function ()
## "ABCDE"
attr(f, "srcref")
## function () s
body(f)
## [1] "ABCDE"
format(f)
## [1] "function () " "\"ABCDE\""
f <- eval(expr)
attr(f, "srcref") <- NULL
f
## function ()
## "ABCDE"
f <- eval(expr)
attr(f, "srcref") <- format(f)
f
## function ()
## "ABCDE"
关于r - 为什么 `print.function` 不同意用 `substitute()` 创建的函数体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68519001/