假设我有一个闭包add_y(y),它返回一个将y添加到其输入中的函数。
add_y <- function(y) {
function(x) {
x + y
}
}
add_4 <- add_y(4)因此,add_4的值是一个将4添加到输入中的函数。这个很管用。我希望使用dput将add_4的定义显示为
function(x) {
x + 4
}但这不是dput的回报。
add_y <- function(y) {
function(x) {
x + y
}
}
add_4 <- add_y(4)
dput(add_4)
#> function (x)
#> {
#> x + y
#> }是否有一种方法可以获得在封闭环境之外运行的源代码?
发布于 2021-12-24 21:42:30
如果您控制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
## }发布于 2021-12-24 19:56:05
不是用dput(),不是。dput()函数不会创建环境的文本表示。
如果你想保存这个函数,你可以
save(add_4, file="add4.Rdata")然后在另一个R会话中
load("add4.Rdata"),它将捕获所有封闭的值,您的函数将像以前一样运行。
https://stackoverflow.com/questions/70476065
复制相似问题