2013-01-08 19 views
7

यह एक बग हो सकता है। उस स्थिति में, मैं इस प्रश्न को हटा दूंगा और बग के रूप में रिपोर्ट करूंगा। मैं चाहता हूं कि कोई यह सुनिश्चित करने के लिए एक नज़र डालें कि मैं कुछ गलत तरीके से नहीं कर रहा हूं इसलिए मैं डेवलपर समय बर्बाद नहीं करता हूं।तेजी से डेटा.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; परीक्षण [जे (foo)] 'परिणाम की उम्मीद है। 'परीक्षण [mo] 'और' mo = data.table (1) के बारे में भी यही सच है; परीक्षण [मो] '। – Justin

+0

इसके अलावा, 'समान (परीक्षण [जे (1)], परीक्षण [जे (मो <- 1)])' 'सत्य 'देता है। – Ryogi

उत्तर

9

यह एक scoping मुद्दा, data.table-faq 2.13 (warning, pdf) में चर्चा के समान है: यह एक scoping मुद्दा है। क्योंकि test में mo नामक एक कॉलम है, जब J(mo) का मूल्यांकन किया जाता है, तो यह वैश्विक वातावरण में पाए गए mo के मूल्य के बजाय पूरे कॉलम को लौटाता है, जो इसे मास्क करता है। (यह scoping व्यवहार जाहिर है, काफी अच्छा जब आप 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 
संबंधित मुद्दे