2014-01-23 39 views
4

我有一個data.table對象上,我想做一個簡單的查找:爲什麼我的非交互式R會話會像data.frame一樣調度data.table?

print(class(dt)) 
print(colnames(dt)) 
print(dt[region == "UK", ]) 

在我的互動R對話,這個塊的代碼不正是它應該。

[1] "data.table" "data.frame" 
[1] "region"   "site"    "visit"    
[4] "connectionfailure" "dnserror"   "http404"   
# ... output ... 

在非交互式腳本會話,我得到一個令人困惑的錯誤:

[1] "data.table" "data.frame" 
[1] "region"   "site"    "visit"    
[4] "connectionfailure" "dnserror"   "http404"   
Error in `[.data.frame`(x, i, j) : object 'region' not found 

它看起來像R的調度dt[....[.data.frame而不是[.data.table。任何想法爲什麼?

+2

最有可能你沒有'庫(data.table)'在批處理執行設置。可能是基於您的用戶配置文件自動加載'data.table',但不是批處理exec。 – BrodieG

+0

@BrodieG,提交答案? –

+0

BrodieG,要清楚:這將解釋''data.table「'顯示爲'dt'的類,但派遣不起作用? – Dhskjlkakdh

回答

3

後人:在批處理執行有問題的代碼是從一個自定義包加載。我忽略在我的包的NAMESPACE文件中包含import(data.table)。我可能是錯的,但是我認爲如果data.table不包括explicit check,那麼[.data.table呼叫環境在其名字空間中包括data.table,即data.table可能是過度的。不過,我相信這個檢查一定有很好的理由。

編輯:約在這裏,明確檢查更多信息:
Using data.table package inside my own package

+1

如果你的包不是* data.table-aware *,'[.data.table'將分派給'[.data.frame'。查看'data.table ::: \'[.data.table \''的前幾行 – Arun

5

很可能您沒有在批次執行中設置library(data.table)。可能是基於您的用戶配置文件自動加載data.table,但不是批量執行。此外,剛剛B/C的東西有一個類data.table,並不意味着包裝:

library(data.table) 
dt <- data.table(a=1:3) 
detach("package:data.table", unload=TRUE) 
class(dt) 
# [1] "data.table" "data.frame" 
setkey(dt, a) 
# Error: could not find function "setkey" 
library(data.table) 
setkey(dt, a) 
#works 
+0

這是一個有用的答案,但不幸的是,它不會導致在我的情況下的解決方案。 'setkey'和其他'data.table'函數被定義並且可以被調用而沒有問題。我不知道爲什麼,但這個問題似乎與'['分離。 – Dhskjlkakdh

+1

@sjbach當你執行'methods(「[」)''時你會看到'data.table'方法嗎?你是否明確加載數據表? – BrodieG

+0

一個很好的後續問題。唉,它是在批處理執行過程中定義的: '... [5] [.data.table * ...'(直接在引發錯誤的索引之前打印) – Dhskjlkakdh

相關問題