1

我正在尝试编写一个函数,它将函数调用作为参数,评估此函数调用的数字参数,然后返回相应的字符向量。这就是我想出的:

ConvertToCharacter <- function(function.call) {
  call.str <- deparse(substitute(function.call))
  return(call.str)
}

> a <- 1
> ConvertToCharacter(sum(2, a))
"sum(2, a)"

> ConvertToCharacter(ddply(mtcars, .(vs), summarize, col=mean(cyl)))
"ddply(mtcars, .(vs), summarize, col = mean(cyl))"

现在,我希望在转换为字符向量之前对数字参数进行评估。因此 ConvertToCharacter(sum(2, a)) 将返回“sum(2, 1)”。我尝试将 env=parent.frame() 传递给替换,但它不起作用。知道我该怎么做吗?

谢谢!

4

2 回答 2

0

您需要递归地检查您的调用,评估符号,并在数值中加入数字,如下所示:

ConvertToCharacter <- function(function.call, env=parent.frame()) {  
  call <- substitute(function.call)
  convert_recurse <- function(x, env) {
    if(is.call(x)) {
      return(as.call(lapply(x, match.fun(sys.call()[[1]]), env=env)))
    } else if (
      is.symbol(x) && 
      is.numeric(try(val <- eval(x, env), silent=TRUE))
    ) {
      return(val)
    } else {
      return(x)
    }    
  }
  deparse(convert_recurse(call, env))
}
a <- 1
ConvertToCharacter(sum(2, a))
lbsToKgs <- 2.2  
ConvertToCharacter(ddply(mtcars, .(vs), summarize, col=mean(cyl), wtkg=mean(wt * lbsToKgs)))

这就是你得到的:

# [1] "sum(2, 1)"         
# [1] "ddply(mtcars, .(vs), summarize, col = mean(cyl), wtkg = mean(wt * "
# [2] "    2.2))"

此外,感谢 Robert 解决了apply/Recall 问题

于 2013-12-30T19:15:35.997 回答
-1
ConvertToCharacter <- function(function.call) {
library(stringr)
str_replace(deparse(substitute(function.call)),"a",eval(a,envir=.GlobalEnv))
}

我希望它有帮助

于 2013-12-30T18:55:52.093 回答