2013-05-12 87 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]的 變量名重複 馬修