2013-05-12 65 views
3

自我索引这里是我的意思,这使得事情说清楚的例子:错误而data.table

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 

任何想法,这里发生了什么?

+0

有趣:'X [IDX == TRUE]'也适用。 'x [(idx)]''也是。 – 2013-05-12 21:13:17

+3

http://thread.gmane.org/gmane.comp.lang.r.datatable/1588/focus=1589 – GSee 2013-05-12 21:19:50

+0

明白了。如果其他人发现它有用但可以随时关闭,我会留下这个问题。 – Alex 2013-05-12 21:28:50

回答

2

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

嗨, 是的预期。从?data.table: “高级:当我是单个变量名称时,它不被视为列名称的表达式,而是在调用范围内进行计算。” 逻辑列的子集是我能想到的唯一例子,其中 这是令人困惑的。但是我们使用这个功能很多,例如 TMP = list(...); DT [TMP] 如果DT在将来 有一列名为TMP的列,那么DT [TMP]不会开始失败。 当我有一个逻辑列boolCol我打包():DT [(boolCol)]。
这就避免了内存分配和== TRUE的扫描,避免DT [DT $ boolCol]的 变量名重复 马修