我想将函数外部定义的对象的内容传递到函数体。 通过一个例子我的问题可能会更容易理解:
a <- 'hello world'
foo <- function() print(a)
rm(a)
foo()
目前,这显然会引发错误,因为调用 foo()
时不再定义 a
。
我想要的结果是我希望 foo
看起来像 function() print('hello world')
最佳答案
1) 本地 捕获 a
使用local
像这样。这修复了 a
的值到当时foo
时的样子被定义。请注意 a
在 a <- 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 像这样。这修复了a
在foo
到 substitute
时的值正在运行。没有使用任何包。
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
之后被删除导致错误。这修复了a
在foo
传递给 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
包含 foo
和a
.
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/