我写了一个使用的函数,match.call它在我直接调用函数时起作用,但是,当函数在另一个函数中被调用时它会中断.我认为它与如何match.call处理环境有关,但我无法弄明白.这是一个可重复的例子:
tester <- function() {
var <- "helloworld"
myFunc(var)
}
myFunc <- function(x) {
tmp <- match.call()
tmp[[1]] <- quote(toupper)
eval(tmp)
}
tester() # error
myFunc("helloworld") # works fine
Run Code Online (Sandbox Code Playgroud)
我相信当它myFunc被调用时tester它找不到var因为它存在于tester函数的孤立环境中.
关于如何myFunc上班的任何想法tester将不胜感激.我试着改变环境eval和match.call,但无济于事.
你的怀疑是完全正确的.
非常简单的解决方案是在其父级的上下文中评估函数:替换eval为eval.parent.
myFunc <- function(x) {
tmp <- match.call()
tmp[[1]] <- quote(toupper)
eval.parent(tmp)
}
Run Code Online (Sandbox Code Playgroud)
通常,该函数traceback可以极大地帮助调试类似的问题:
> tester()
Error in as.character(x) :
cannot coerce type 'closure' to vector of type 'character'
Run Code Online (Sandbox Code Playgroud)
好的,但我们谈论的是"封闭"(=功能)?
> traceback()
5: toupper(x = var)
4: eval(expr, envir, enclos)
3: eval(tmp) at #5
2: myFunc(var) at #5
1: tester()
Run Code Online (Sandbox Code Playgroud)
第一行有线索:toupper(x = var).在上下文中tester,var指的stats::var是因为其包附加而找到的函数(闭包).