2013-01-08 25 views
7

這可能是一個錯誤。在這種情況下,我會刪除這個問題並報告爲錯誤。我希望有人看一看,以確保我沒有做錯某些事情,所以我不浪費開發人員的時間。快速加入data.table(潛在錯誤,報告前檢查)

test = data.table(mo=1:100, b=100:1, key=c("mo", "b")) 
mo = 1 
test[J(mo)] 

返回整個test data.table而不是由

test[J(1)] 

我相信,錯誤可能來自test具有相同的列名作爲表正在被加入現身返回正確的結果通過,mo。其他人是否也遇到同樣的問題?

+1

我無法解釋行爲,但fwiw:'foo = 1;測試[J(foo)]'有預期的結果。 'test [mo]'和'mo = data.table(1);試驗[MO]'。 – Justin

+0

另外,'相同(test [J(1)],test [J(mo <-1)])給出'TRUE'。 – Ryogi

回答

9

這是一個範圍的問題,類似於data.table-faq 2.13 (warning, pdf)討論的。由於test包含名爲mo的列,因此在計算J(mo)時,它將返回整個列,而不是在全局環境中找到的掩碼爲mo的值。 (此作用域的行爲,當然,相當不錯當你想要做這樣的事情test[mo<4]!)

嘗試使用此方法看到這是怎麼回事:

test <- data.table(mo=1:5, b=5:1, key=c("mo", "b")) 
mo <- 1 
test[browser()] 
Browse[1]> J(mo) 
# mo 
# 1: 1 
# 2: 2 
# 3: 3 
# 4: 4 
# 5: 5 
# Browse[1]> 

正如鏈接常見問題建議,一個簡單的解決方案是重命名索引變量:

MO <- 1 
test[J(MO)] 
# mo b 
# 1: 1 6 

(這也將工作,爲的文檔中討論的原因在?data.table):

mo <- data.table(1) 
test[mo] 
# mo b 
# 1: 1 6 
4

這不是一個錯誤,但記錄的行爲afaik。這是一個範圍問題:

test[J(globalenv()$mo)] 
    mo b 
1: 1 100