crf*_*crf 8 closures r r-environment
假设我有一个闭包add_y(y),它返回一个添加到其输入的函数y。
add_y <- function(y) {
function(x) {
x + y
}
}
add_4 <- add_y(4)
Run Code Online (Sandbox Code Playgroud)
因此 的值add_4是一个将其输入加 4 的函数。这有效。我想用来展示asdput的定义add_4
function(x) {
x + 4
}
Run Code Online (Sandbox Code Playgroud)
但这不是 dput 返回的内容。
add_y <- function(y) {
function(x) {
x + y
}
}
add_4 <- add_y(4)
dput(add_4)
#> function (x)
#> {
#> x + y
#> }
Run Code Online (Sandbox Code Playgroud)
有没有办法获取可以在封闭环境之外运行的源代码?
如果您控制 add_y,那么解决方法是将 y 的值直接注入到内部函数的主体中,或者将其注入到形式参数列表中。这消除了环境的使用,因此问题不再存在。这涉及命名匿名内部函数,并且只需要额外一行来执行注入,再加上一行来返回结果。
# 1. inject into body
add_y2 <- function(y) {
inner <- function(x) {
x + y
}
body(inner) <- do.call("substitute", list(body(inner)))
inner
}
# test
add_4 <- add_y2(4)
dput(add_4)
## function (x)
## {
## x + 4
## }
# 2. inject into formal arguments
add_y3 <- function(y) {
inner <- function(x) {
x + y
}
formals(inner)$y <- y
inner
}
# test
add_4 <- add_y3(4)
dput(add_4)
## function (x, y = 4)
## {
## x + y
## }
Run Code Online (Sandbox Code Playgroud)