我正在阅读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没有?它与我的评估有关吗?或者它实际上是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')
答案 0 :(得分:0)
这是你在找什么?
fPrintArgument <- function(i) {
cc <- sys.call(sys.parent(1))
print(deparse(cc[[2]]))
}
fCall <- function(x){
fPrintArgument(x)
}
fCall('C')
fCall(id == 'C')