如果有一个返回函数的函数:
makeFunction <- function (d) {
function (x) { x/d }
}
f <- makeFunction(2)
print(f)
# function (x) { x/d }
# <environment: 0x34216b8>
f(4) # 2, as expected
我想要的是让f
简单地“成为”function (x) { x/2 }
。通过“be”,我的意思是它不包含那个环境(其中d
的值),当我print
时,它显示function (x) { x/2 }
。
这样的事情有可能吗?
我几乎可以使用substitute
:
makeFunction.sub <- function (d) {
substitute(function (x) { x/d }, list(d=d))
}
g <- makeFunction.sub(2)
print(g)
# function(x) {
# x/2
# }
但是,g
不是函数 - 它是一个调用。所以要获得eval
所需的功能。但随后它失去了2并恢复为d
:
eval(g)
# function (x) { x/d }
有什么方法可以让返回的函数忘记d
并直接替换2?
(在实践中,我不介意携带环境,但我只是好奇......)
将this question/answer标记为dupe(井,子集)(感谢@joran)。
那个问题&amp;答案要详细得多,所以记录:
makeFunction <- function (d) {
of <- function (x) {}
# do the substitution of d in the body
body(of) <- substitute(x/d, list(d=d))
# don't need to carry around the little local environment anymore
environment(of) <- .GlobalEnv
return(of)
}
h <- makeFunction(2)
print(h)
# function (x)
# x/2