函数参数的R评估

4
我正在阅读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的评估有关吗?还是它实际上是数据表包中特定的内容?
编辑:
感谢您迄今为止的回答。我有点明白了,我同意它是 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')

3
间接地说,你的问题与https://dev59.com/f2Uq5IYBdhLWcg3wC8Hx是重复的,我在那里提出过几乎相同的问题,只不过用了不同的措辞。 - Andrie
如果你使用非data.table的向量进行操作,你会看到行为上的差异。 - Carl Witthoft
1
@Ferdinand.kraft 我只是想尝试基本的 function(i){myvector[i]},同样也是针对 function(i){isub<-sutstitute(i);myvector[i]} - Carl Witthoft
2
@Ferdinand.kraft - [.data.table 处理 i(和 j)参数,并在前导调用为 eval 时特别处理它们。 - mnel
@mnel,现在开始有意义了 :-) - Ferdinand.kraft
显示剩余4条评论
1个回答

0

这是你要找的吗?

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接