3

这是我的意思的一个例子,它使事情变得清晰:

require(data.table)
x = data.table(a=1:10, idx=sample(c(TRUE, FALSE), 10, replace=TRUE))
x[idx]
Error in eval(expr, envir, enclos) : object 'idx' not found

但是,以下工作:

x[idx[]]
#a  idx
#1:  2 TRUE
#2:  5 TRUE
#3:  7 TRUE
#4:  9 TRUE
#5: 10 TRUE

知道这里发生了什么吗?

4

1 回答 1

2

引用@GSee 评论中提供的链接。

嗨,是的,预计。来自 ?data.table:“高级:当 i 是单个变量名时,它不被视为列名的表达式,而是在调用范围内进行评估。” 逻辑列的子集是我能想到的唯一令人困惑的例子。但是我们经常使用这个特性,例如 TMP=list(...);DT[TMP] 是安全的,因为知道如果 DT 将来有一个名为 TMP 的列,DT[TMP] 不会开始失败。当我有一个逻辑列 boolCol 时,我用 (): DT[(boolCol)] 包装。
这样就避免了==TRUE的内存分配和扫描,也避免了DT[DT$boolCol] Matthew的变量名重复

于 2013-05-13T20:19:44.997 回答