您可以构造一个dput
替换来生成创建类似函数的代码add_4
,但它不会按照您想要的方式进行解析:
dput_with_env <- function(f) {
fn <- deparse(f, control = c("keepNA", "keepInteger",
"niceNames", "showAttributes"))
env <- as.list(environment(f))
cat("local({ f =\n")
cat(fn, sep = "\n")
cat("\nenvironment(f) <- list2env(\n")
dput(env)
cat(")\nf})")
}
add_y <- function(y) {
function(x) {
x + y
}
}
add_4 <- add_y(4)
dput_with_env(add_4)
#> local({ f =
#> function (x)
#> {
#> x + y
#> }
#>
#> environment(f) <- list2env(
#> list(y = 4)
#> )
#> f})
由reprex 包于 2021-12-24 创建(v2.0.1)
这假设环境add_4
非常简单,因此其环境的父级可以是您评估代码时所在的环境。我们可以试一试:
newfn <- local({ f =
function (x)
{
x + y
}
environment(f) <- list2env(
list(y = 4)
)
f})
newfn
#> function (x)
#> {
#> x + y
#> }
#> <environment: 0x7f9a1b5e2318>
newfn(1)
#> [1] 5
由reprex 包于 2021-12-24 创建(v2.0.1)