अक्सर यह कहा जाता है कि data.frame
list
से विरासत में आता है, जो डेटा.फ्रेम कॉलम ($
, sapply
इत्यादि) तक पहुंचने के लिए कई सामान्य प्रतिमानों को समझ में आता है।क्लास (data.frame (...)) सूची विरासत क्यों नहीं दिखाता है?
dat <- data.frame(x=runif(100),y=runif(100),z=runif(100),g=as.factor(rep(letters[1:10],10)))
> class(dat)
[1] "data.frame"
एक data.frame
Unclassing से पता चलता है कि यह एक सूची है:
> class(unclass(dat))
[1] "list"
और परीक्षण यह कैसा दिखता है
फिर भी "list"
आइटम के बीच नहीं एक data.frame
वस्तु की कक्षा सूची में लौट आए है यदि कोई डेटा नहीं है तो डिफ़ॉल्ट विधि सूची विधि को वरीयता में बुलाया जाएगा। फ्रेम विधि:
> f <- function(x) UseMethod('f')
> f.default <- function(x) cat("Default")
> f.list <- function(x) cat('List')
> f(dat)
Default
> f.data.frame <- function(x) cat('DF')
> f(dat)
DF
तो
दो सवाल:
data.frame
के लिए विफलता औपचारिक रूप से वारिस हैlist
एक डिजाइन के नजरिए से किसी भी लाभ है से?- सूचियों के रूप में
data.frame
एस का इलाज करने वाले उन कार्यों को सूचियों के रूप में कैसे माना जाता है?lapply
को देखने से ऐसा लगता है कि यह सी आंतरिक कोड को बहुत तेज़ी से जाता है, तो शायद यह है, लेकिन मेरे दिमाग में थोड़ा उड़ाया गया है।
मैं इसे दक्षता करने पर निर्भर करता है लगता है। एस 3 विधि प्रेषण महंगा है और सूची आर में एक बहुत ही बुनियादी डेटा संरचना है। इस प्रकार, उन्हें सी स्तर पर निपटाया जाता है। उदा।, यहां तक कि 'is.list' एक आदिम है (' is.data.frame' के विपरीत)। – Roland
जो कोई भी 'सूची' से 'data.frame' _inherits_ कहता है गलत है। उनका क्या अर्थ है कि डेटा.फ्रेम को कुछ विशेषताओं और विशेषताओं के साथ एक सूची के रूप में लागू किया जाता है। 'lapply' कॉल 'as.list' अगर' X' वेक्टर नहीं है या यदि 'is.object'' TRUE' है (मूल रूप से यदि कोई' वर्ग' विशेषता है)। 'as.list'' data.frame' विधि के साथ सामान्य है। –
मैं इसे थोड़ा सा http://adv-r.had.co.nz/OO-essentials.html#method-dispatch में चर्चा करता हूं। @ जोशुआउलिच मुझे नहीं लगता कि यह कहने के लिए अनुचित है कि डेटा.फ्रेम सूची से विरासत में है, लेकिन यह जटिल है क्योंकि सूची और डेटा फ्रेम एक ही ऑब्जेक्ट सिस्टम से संबंधित नहीं है। – hadley