我正在阅读http://www.cran.r-project.org/doc/manuals/R-lang.pdf手册第4.3章,但我听不懂。也许有人可以给我一个简短的解释,为什么R会以以下方式表现。

fCall <- function(i){
    dtData[i]
}

fSubstituteCall <- function(i){
    iSub <- substitute(i)
    dtData[eval(iSub)]
}


library(data.table)
dtData <- data.table(id=LETTERS, value=1:26)
dtData[id == 'C']           #works
fCall(id == 'C')            #Error in eval(expr, envir, enclos) : object 'id'     not found
fSubstituteCall(id == 'C')  #works

为什么fSubstituteCall有效而fCall不起作用?与i的评估有关吗?还是实际上是特定于data.table包的东西?

编辑:

到目前为止,谢谢您的回答。我有点理解,我同意这是stackoverflow.com/q/14837902/602276的副本。因此,我将简化我的问题。

如何使fPrintArgument将参数i打印为字符串?因此,在fCall('C')情况下,它应该打印出字符串'C',而在fCall(id =='C')中,它应该打印出字符串'id ==“C”'。

这可能吗?
fPrintArgument <- function(i){
#This is what i have come up with so far, but it doesn't work
    print(deparse(substitute(i)))
    print(deparse((i)))
}

fCall <- function(x){
    fPrintArgument(x)
}

fCall('C')
fCall(id == 'C')

最佳答案

您在找什么吗?

fPrintArgument <- function(i) {
  cc <- sys.call(sys.parent(1))
  print(deparse(cc[[2]]))
}
fCall <- function(x){
  fPrintArgument(x)
}
fCall('C')
fCall(id == 'C')

08-26 15:25