2013-03-27 9 views
13

j में [.data.table कॉल के लिए अभिव्यक्तियों का निर्माण करते समय, .SD की सामग्री के साथ जांच करने और खेलने में सक्षम होने में अक्सर मददगार होता।कर सकते हैं। एसडी को ब्राउज़र से [.data.table() में देखा जा सकता है?

यह अनुभवहीन प्रयास काम नहीं करता है ...

library(data.table) 
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) 

DT[, browser(), by=x] 
# Called from: `[.data.table`(DT, , browser(), by = x) 
Browse[1]> 
Browse[1]> .SD 
# NULL data.table 

... भले ही .SD और वर्तमान data.table सबसेट से संबंधित कई अन्य नाम के एक चर स्थानीय वातावरण में सभी उपस्थित हैं

Browse[1]> ls(all.names = TRUE) 
# [1] ".BY"  ".GRP"  ".I"  ".iSD"  ".N"  ".SD"  
# [7] "Cfastmean" "mean"  "print"  "x"   
Browse[1]> .N 
# [1] 3 
Browse[1]> .I 
# [1] 4 5 6 

.I का उपयोग करना, मैं +/- .SD की तरह कुछ देख सकते हैं, लेकिन यह सक्षम होने के लिए अच्छा होगा सीधे अपने मूल्य तक पहुँचने के लिए:

Browse[1]> DT[.I] 
# x y v 
# 1: b 1 4 
# 2: b 3 5 
# 3: b 6 6 

मेरे सवालों का: क्यों एक browser() कॉल में से नहीं सीधे उपलब्ध .SD की उम्मीद मूल्य (जबकि .I, .N, .GRP और .BY कर रहे हैं) है? .SD के मूल्य तक पहुंचने का कोई वैकल्पिक तरीका है?

+2

मैं जीता der, उस समय 'ब्राउज़र()' कहा जाता है, वास्तव में 'एसडी' कुछ भी के साथ आबादी है? 'str (.SD) 'वर्ग' डेटा 'डेटा' और 'data.frame' दिखाता है: \t 0 obs। 0 चर के 0 आदि –

+0

@GavinSimpson - मुझे लगता है कि आप शायद वहां कुछ पर हैं। मैंने जो आंशिक उत्तर अभी जोड़ा है उस दिशा में अतिरिक्त सबूत की तरह लगता है। मुझे आश्चर्य है कि अगर एसएसडी का देरी मूल्यांकन किसी भी तरह से शामिल है। –

उत्तर

14

मैथ्यू Dowle की टिप्पणी के आलोक में अपडेट किया गया:

ऐसा लगता है कि .SD, है आंतरिक रूप से, पर्यावरण के भीतर जो सभीj भाव मूल्यांकन किया जाता है, उन जो स्पष्ट संदर्भ नहीं है .SD बिल्कुल सहित । DT के प्रत्येक उप-समूह के लिए DT के कॉलम के साथ इसे भरना सस्ता नहीं है, इसी प्रकार, [.data.table() तब तक ऐसा नहीं करेगा जब तक कि इसे वास्तव में आवश्यकता न हो।

इसके बजाय, तर्कों के आर के आलसी-मूल्यांकन के बनाने बहुत काम है, यह unevaluated j अभिव्यक्ति पूर्वावलोकन, और केवल .SD कॉलम कि उसमें संदर्भित करने के लिए कहते हैं। यदि .SD का स्वयं उल्लेख किया गया है, तो यह DT के कॉलम जोड़ता है।

तो, .SD देखने के लिए, बस j -expression में इसके लिए कुछ संदर्भ शामिल करें। यहाँ कई भाव है कि काम करेंगे में से एक है: यहाँ

library(data.table) 
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) 

## This works 
DT[, if(nrow(.SD)) browser(), by=x] 
# Called from: `[.data.table`(DT, , if (nrow(.SD)) browser(), by = x) 
Browse[1]> .SD 
# y v 
# 1: 1 1 
# 2: 3 2 
# 3: 6 3 

और कुछ और कर रहे हैं:

DT[,{.SD; browser()}, by=x] 
DT[,{browser(); .SD}, by=x] ## Notice that order doesn't matter 

खुद के लिए देखने के लिए कि .SD सिर्फ j -expression द्वारा आवश्यक स्तंभों को लोड करता है, इन प्रत्येक चलाने बदले में (ब्राउज़र वातावरण में प्रवेश .SD टाइपिंग, और Q इसे छोड़ और सामान्य कमांड लाइन पर लौटने के लिए):

DT[, {.N * y ; browser()}, by=x] 
DT[, {v^2 ; browser()}, by=x] 
DT[, {y*v ; browser()}, by=x] 
+1

एफडब्ल्यूआईडब्ल्यू, 'डीटी [, {एसडी; ब्राउज़र()}, = x द्वारा] 'भी काम करता है। –

+0

धारा 2.1 का [डेटा '।टेबल 'एफएक्यू] (http://datatable.r-forge.r-project.org/datatable-faq.pdf)' एसडी 'का उपयोग कर भारी धीमी गति से संदर्भित करता है। –

+0

जोश, वास्तव में नहीं। एफएक्यू के सेक्शन 2.1 'एसडी' का उपयोग करने की सिफारिश करते हैं, लेकिन * नहीं * के साथ 'FALSE'' के साथ। ** ** एसडी ऑब्जेक्ट को एक समारोह में तर्क देने से आंतरिक रूप से और अधिक कुशलतापूर्वक कार्यान्वित किया जाता है। कृपया ऐसा न करें हालांकि: 'डीटी [, एसडी [," बिक्री ", = गलत] के साथ, = grp]' ** **। – Arun

संबंधित मुद्दे

 संबंधित मुद्दे