在我的 R 开发中,我需要将函数原语包装在proto
对象中,以便在$perform()
调用对象的方法时可以将许多参数自动传递给函数。函数调用在内部通过do.call()
. 一切都很好,除非函数试图从定义它的闭包中访问变量。在这种情况下,该函数无法解析名称。
这是我发现的重现该行为的最小示例:
library(proto)
make_command <- function(operation) {
proto(
func = operation,
perform = function(., ...) {
func <- with(., func) # unbinds proto method
do.call(func, list(), envir=environment(operation))
}
)
}
test_case <- function() {
result <- 100
make_command(function() result)$perform()
}
# Will generate error:
# Error in function () : object 'result' not found
test_case()
我有一个可重复的testthat
测试,它也输出大量的诊断输出。诊断输出让我难过。通过查找父环境链,我的位于函数内部的诊断代码找到并打印了函数无法找到的同一个变量。请参阅此要点。.
如何do.call
正确设置环境?