r - 如何将对象从 R 函数外部传递到函数体?

标签 r function

我想将函数外部定义的对象的内容传递到函数体。 通过一个例子我的问题可能会更容易理解:

a <- 'hello world'
foo <- function() print(a)
rm(a)
foo()

目前,这显然会引发错误,因为调用 foo() 时不再定义 a

我想要的结果是我希望 foo 看起来像 function() print('hello world')

最佳答案

1) 本地 捕获 a使用local像这样。这修复了 a 的值到当时foo时的样子被定义。请注意 aa <- a 的右侧是a已经定义,而a左侧是一个新对象,也称为 a ,在 local 中定义。没有使用任何包。

a <- 'hello world'
foo <- local({
  a <- a
  function() print(a)
})

rm(a)
foo()
## [1] "hello world"

2) 替换 另一种选择是替换 a 的值进入foo的 body 像这样。这修复了afoosubstitute 时的值正在运行。没有使用任何包。

foo <- function() print(a)

a <- 'hello world'
body(foo) <- do.call("substitute", list(body(foo), list(a = a)))

rm(a)
foo()
## [1] "hello world"

3) 生成 foo 的函数 另一种可能性是创建一个生成 foo 的函数。请注意,R 使用惰性求值,因此我们需要使用 force确保 a 的值当时foogen使用运行;否则,它将延迟评估直到a之后被删除导致错误。这修复了afoo传递给 foogen 的值。没有使用任何包。

foogen <- function(a) {
  force(a)
  function() print(a)
}

a <- 'hello world'
foo <- foogen(a)
rm(a)
foo()
## [1] "hello world"

4) proto proto包可以用来创建对象p包含 fooa .

library(proto)

p <- proto(foo = function(.) print(a))

a <- 'hello world'
p$a <- a
rm(a)
p$foo()
## [1] "hello world"

关于r - 如何将对象从 R 函数外部传递到函数体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69912338/

相关文章:

r - 按列分组,然后计算 R 中每隔一列的均值和标准差

r - 是否有一个运算符可以代替函数 coord_map() 的 '+' 符号?

javascript - 了解函数的返回值

iphone - 如何传递指针并在函数中得到结果?

vb.net - 如何使 VB.NET 函数的参数作为泛型类型?

python - Python/Pandas 中的 R 向量语法

r - 决策树分析问题

r - 修改列表和环境

javascript - 使用 JavaScript 从 HTML 按钮获取值

mysql - 如何在mysql中为预先插入的记录插入唯一的id