2013-10-26 7 views
8

अक्सर यह कहा जाता है कि data.framelist से विरासत में आता है, जो डेटा.फ्रेम कॉलम ($, 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 
तो

दो सवाल:

  1. data.frame के लिए विफलता औपचारिक रूप से वारिस है list एक डिजाइन के नजरिए से किसी भी लाभ है से?
  2. सूचियों के रूप में data.frame एस का इलाज करने वाले उन कार्यों को सूचियों के रूप में कैसे माना जाता है? lapply को देखने से ऐसा लगता है कि यह सी आंतरिक कोड को बहुत तेज़ी से जाता है, तो शायद यह है, लेकिन मेरे दिमाग में थोड़ा उड़ाया गया है।
+4

मैं इसे दक्षता करने पर निर्भर करता है लगता है। एस 3 विधि प्रेषण महंगा है और सूची आर में एक बहुत ही बुनियादी डेटा संरचना है। इस प्रकार, उन्हें सी स्तर पर निपटाया जाता है। उदा।, यहां तक ​​कि 'is.list' एक आदिम है (' is.data.frame' के विपरीत)। – Roland

+4

जो कोई भी 'सूची' से 'data.frame' _inherits_ कहता है गलत है। उनका क्या अर्थ है कि डेटा.फ्रेम को कुछ विशेषताओं और विशेषताओं के साथ एक सूची के रूप में लागू किया जाता है। 'lapply' कॉल 'as.list' अगर' X' वेक्टर नहीं है या यदि 'is.object'' TRUE' है (मूल रूप से यदि कोई' वर्ग' विशेषता है)। 'as.list'' data.frame' विधि के साथ सामान्य है। –

+4

मैं इसे थोड़ा सा http://adv-r.had.co.nz/OO-essentials.html#method-dispatch में चर्चा करता हूं। @ जोशुआउलिच मुझे नहीं लगता कि यह कहने के लिए अनुचित है कि डेटा.फ्रेम सूची से विरासत में है, लेकिन यह जटिल है क्योंकि सूची और डेटा फ्रेम एक ही ऑब्जेक्ट सिस्टम से संबंधित नहीं है। – hadley

उत्तर

1

मैं स्वीकार करता हूं कि आर में कक्षाएं मुझे थोड़ा उलझन में भी हैं। लेकिन मुझे याद है कि "आर डेटा.फ्रेम में वास्तव में वैक्टर की सूचियां हैं" जैसे कुछ पढ़ना। अपने उदाहरण से कोड का उपयोग करना, हम इसकी पुष्टि कर सकते हैं:

> is.list(dat) 
[1] TRUE 
?is.list 

ध्यान दें कि हम भी dat के तत्वों (कॉलम) तक पहुँचने के लिए है, जो अनुसंधान में सूचियों के तत्वों का उपयोग करने के सामान्य तरीके से है [[]] ऑपरेटर का उपयोग कर सकते हैं :

> identical(dat$x, dat[[1]]) 
[1] TRUE 

हम यह भी सत्यापित कर सकते हैं कि प्रत्येक स्तंभ वास्तव में एक वेक्टर है:

> is.vector(dat$x) 
[1] TRUE 
संबंधित मुद्दे