函数返回函数 - 替换参数

时间:2015-09-08 03:55:01

标签: r

如果有一个返回函数的函数:

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

0 个答案:

没有答案