पैकेज data.table
में कुछ विशेष वाक्यविन्यास हैं जिनके लिए i
और j
तर्कों के रूप में अभिव्यक्तियों का उपयोग करने की आवश्यकता है।कोई फ़ंक्शन कैसे लिखें जो फ़ंक्शन को कॉल करता है जो डेटा.table को कॉल करता है?
इस पर कुछ प्रभाव पड़ता है कि कैसे एक लेख लिखता है जो डेटा टेबल पर तर्क स्वीकार करता है और पास करता है, जैसा कि section 1.16 of the FAQs में वास्तव में अच्छी तरह से समझाया गया है।
लेकिन मैं यह नहीं समझ सकता कि यह एक अतिरिक्त स्तर कैसे लेना है।
यहां एक उदाहरण है। ,
library(data.table)
foo <- function(data, by){
by <- substitute(by)
data[, .N, by=list(eval(by))]
}
DT <- data.table(mtcars)
foo(DT, gear)
ठीक है, यह काम करता है क्योंकि मैं अपने सारणीबद्ध परिणाम प्राप्त: मैं एक आवरण समारोह foo()
कि मेरे डेटा का विशिष्ट सारांश बनाता है, और फिर एक दूसरे आवरण plotfoo()
कि foo()
कॉल करता है और परिणाम भूखंडों लिखना चाहते कहो :
by N
1: 4 12
2: 3 15
3: 5 5
अब, मैं जब plotfoo()
लेखन सिर्फ एक ही करने की कोशिश, लेकिन मैं बुरी तरह असफल:
plotfoo <- function(data, by){
by <- substitute(by)
foo(data, eval(by))
}
plotfoo(DT, gear)
लेकिन इस बार मैंने एक त्रुटि संदेश मिलता है:
Error: evaluation nested too deeply: infinite recursion/options(expressions=)?
ठीक है, तो eval()
एक समस्या खड़ी कर रहा है। के इसे हटाने करते हैं:
plotfoo <- function(data, by){
by <- substitute(by)
foo(data, by)
}
plotfoo(DT, gear)
एक नया त्रुटि संदेश अरे नहीं, मैं:
Error in `[.data.table`(data, , .N, by = list(eval(by))) :
column or expression 1 of 'by' or 'keyby' is type symbol. Do not quote column names. Useage: DT[,sum(colC),by=list(colA,month(colB))]
और यहाँ है मैं कहाँ अटक रहते हैं।
प्रश्न: एक फ़ंक्शन कैसे लिखें जो डेटा.table को कॉल करने वाले फ़ंक्शन को कॉल करता है?
नहीं एक समाधान है, लेकिन आप 'विकल्प को दूर करता है, तो (द्वारा) 'और' eval' और 'goo' को' चर (डीटी, "गियर") जैसे चरित्र चर के रूप में पास करें, फिर दोनों कार्य। – Arun