【问题标题】:R evaluation of function argument函数参数的R评估
【发布时间】:2013-08-31 12:14:15
【问题描述】:

我正在阅读 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')

【问题讨论】:

  • 间接地,您的问题与stackoverflow.com/q/14837902/602276 重复,我用不同的词问了几乎相同的问题。
  • 如果您使用非data.table 向量执行此操作,您会看到行为上的差异。
  • @CarlWitthoft,你是什么意思?使用原子向量,符号id 将保持未解析。
  • @Ferdinand.kraft 我只是想尝试基本的function(i){myvector[i]}function(i){isub&lt;-sutstitute(i);myvector[i]} 的同上
  • @Ferdinand.kraft -[.data.table 按摩i(和j)参数,并在主要调用是eval时特别处理它们

标签: r data.table


【解决方案1】:

这是你要找的吗?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多