首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能在封闭环境之外运行‘`dput`’返回源代码?

是否有可能在封闭环境之外运行‘`dput`’返回源代码?
EN

Stack Overflow用户
提问于 2021-12-24 19:35:07
回答 2查看 141关注 0票数 8

假设我有一个闭包add_y(y),它返回一个将y添加到其输入中的函数。

代码语言:javascript
复制
add_y <- function(y) {
  function(x) {
    x + y
  }
}
add_4 <- add_y(4)

因此,add_4的值是一个将4添加到输入中的函数。这个很管用。我希望使用dputadd_4的定义显示为

代码语言:javascript
复制
function(x) {
  x + 4
}

但这不是dput的回报。

代码语言:javascript
复制
add_y <- function(y) {
  function(x) {
    x + y
  }
}
add_4 <- add_y(4)
dput(add_4)
#> function (x) 
#> {
#>     x + y
#> }

是否有一种方法可以获得在封闭环境之外运行的源代码?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-24 21:42:30

如果您控制add_y,那么一个解决方法是将y的值直接注入到内部函数的主体中,或者将其注入正式的参数列表。这就消除了环境的使用,因此问题不再存在。这涉及到命名匿名内部函数,并且只需要额外的一行来执行注入,再加上一行来返回结果。

代码语言:javascript
复制
# 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
## }
票数 7
EN

Stack Overflow用户

发布于 2021-12-24 19:56:05

不是用dput(),不是。dput()函数不会创建环境的文本表示。

如果你想保存这个函数,你可以

代码语言:javascript
复制
save(add_4, file="add4.Rdata")

然后在另一个R会话中

代码语言:javascript
复制
load("add4.Rdata")

,它将捕获所有封闭的值,您的函数将像以前一样运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70476065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档