match.call问题

Car*_*arl 3 r

我写了一个使用的函数,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将不胜感激.我试着改变环境evalmatch.call,但无济于事.

Kon*_*lph 5

你的怀疑是完全正确的.

非常简单的解决方案是在其父级的上下文中评估函数:替换evaleval.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是因为其包附加而找到的函数(闭包).