में संदर्भ द्वारा असाइनमेंट पर ऑप्टिमाइज़ेशन संदेशों को समझना यह @sds here से इस प्रश्न का उत्तर देने के दौरान एक अवलोकन से है। अब,डेटाटेबल
options(datatable.verbose = TRUE)
dt <- data.table(a = c(rep(3, 5), rep(4, 5)), b=1:10, c=11:20, d=21:30, key="a")
लगता है एक स्तंभ a
के आधार पर वर्गीकृत सभी कॉलम का कुल योग प्राप्त करना चाहता है, तो, हम कर सकता है::
सबसे पहले, मुझे ट्रेस संदेशों पर स्विच data.table
के लिए जाने
dt.out <- dt[, lapply(.SD, sum), by = a]
अब, मान लीजिए कि मैं प्रत्येक समूह से संबंधित प्रविष्टियों की संख्या dt.out
पर जोड़ना चाहता हूं, तो मैं इसे सामान्य रूप से संदर्भ के अनुसार निर्दिष्ट करता हूं:
dt.out[, count := dt[, .N, by=a][, N]]
# or alternatively
dt.out[, count := dt[, .N, by=a][["N"]]]
इस असाइनमेंट में संदर्भ द्वारा, संदेशों data.table
पैदा करता है में से एक है:
RHS for item 1 has been duplicated. Either NAMED vector or recycled list RHS.
यह data.table के स्रोत निर्देशिका assign.C
में एक फ़ाइल से एक संदेश है। मैं यहां प्रासंगिक स्निपेट पेस्ट नहीं करना चाहता क्योंकि यह लगभग 18 लाइनें है। यदि आवश्यक हो, तो बस एक टिप्पणी छोड़ दो और मैं कोड पेस्ट कर दूंगा। dt[, .N, by=a][["N"]]
बस [1] 5 5
देता है। तो, यह named vector
है। और मैं समझता हूँ कि नहीं क्या आरएचएस में इस recycled list
है ..
लेकिन अगर मैं कार्य करें:
dt.out[, `:=`(count = dt[, .N, by=a][, N])]
# or equivalently
dt.out[, `:=`(count = dt[, .N, by=a][["N"]])]
फिर, मैं संदेश मिलता है:
Direct plonk of unnamed RHS, no copy.
मैं इस को समझने के रूप में पहले मामले में आरएचएस डुप्लिकेट रहा है, जिसका अर्थ है कि यह एक प्रतिलिपि बना रहा है (उथला/गहरा, यह मुझे नहीं पता)। यदि हां, तो यह क्यों हो रहा है?
भले ही नहीं, आंतरिक रूप से दो के बीच संदर्भ द्वारा असाइनमेंट में परिवर्तन क्यों? कोई विचार?
मुख्य अंतर्निहित सवाल है कि मैं अपने मन में था, जबकि इस पोस्ट लिख बाहर लाने के लिए (और भूल गए लगते हैं!): dt.out[, count := dt[, .N, by=a][["N"]]]
(ऐसा करने का दूसरा तरीका की तुलना में आवंटित करने के लिए यह "कम कुशल" है यह)?
उत्तर देने में खुशी है लेकिन एसओ में क्या प्रश्न हैं। समझ? मैं अब के लिए पहले भाग का जवाब दूंगा ... –
मैं यह सुनिश्चित करने के लिए प्रश्न संपादित करूंगा कि मेरा प्रश्न है, यहां के अलावा, यह * अक्षम है * 'a: = .' का उपयोग करके असाइन करने के लिए। – Arun
शीर्ष पर मुझे काफी यकीन है कि यह 'विकल्प (डेटाटेबल.वरबोज = TRUE) होना चाहिए। 'Datatable.warnings' विकल्प नहीं है लेकिन कुछ भी शिकायत नहीं करेगा कि यह सेटिंग अप्रभावी थी। –