2016-10-18 10 views
6

मैं कुछ कस्टम श्रेणियां होती हैं, उदाहरण के लिए की सूची के लिए 'असूचीबद्ध' तरीके:आर - कस्टम कक्षाओं

setClass("foo", slots = c(mat = "matrix")) 

मैं संभाल करने के लिए कैसे foo वस्तुओं की एक सूची 'को असूचीबद्ध करें' कर रहे हैं चाहते हैं।

mat <- matrix(rnorm(16), 4) 
foo <- new("foo", mat = mat) 
unlist(list(foo)) 

मैं शायद c के लिए तरीके (जो मैं इस्तेमाल किया गया था सोचा, लेकिन शायद गलत रूप से) और unlist समस्या का समाधान होगा बनाने सोचा।

S3 संस्करण

#' @export 
unlist <- function(x, ...) UseMethod("unlist", x) 

#' @export 
unlist.default <- base::unlist 
#' @method unlist foo 
#' @export 
unlist.foo <- function(x, ...){ 
    print("called foo unlist") 
} 

एस 4 संस्करण

#' @export 
setMethod("unlist", 
      signature = "foo", 
      function(x, recursive = TRUE, use.names = TRUE){ 
      print("call foo unlist") 
      }) 

c समारोह

#' @export 
setMethod("c", 
      signature = "foo", 
      function(x, ..., recursive = FALSE){ 
      print("called foo c") 
}) 

लेकिन जब मैं c सीधे का उपयोग मैं केवल पुष्टिकरण संदेश दिखाई:

c(foo) 
[1] "called foo c" 

unlist सिर्फ एक ही वस्तु कोई प्रिंट संदेश

unlist(list(foo)) 
[[1]] 
An object of class "foo" 
Slot "mat": 
      [,1]  [,2]  [,3]  [,4] 
[1,] 0.6711541 -0.2783441 -0.4707375 -0.23060105 
[2,] 0.7408401 0.4076826 2.2757187 -0.48547413 
[3,] 1.8640581 0.3610619 -0.4632473 -0.06498348 
[4,] -0.5595930 0.6679157 -0.8142456 0.27499963 

साथ अगर मैं फोन unlist(foo) तो मैं प्रिंट संदेश मिलता है, लेकिन मैं foo वस्तुओं की एक सूची पर इसे लागू करने की जरूरत है देता है। किसी सूची में कस्टम वर्गों के साथ मैं कैसे असूचीबद्ध कर सकता हूं इस पर कोई विचार?

अंत में मैं निम्नलिखित TRUE लौटना चाहते:

all.equal(unlist(list(foo)), unlist(list(mat))) 
+1

'असूची 'एक एस 3 विधि की तरह नहीं दिखता है। यदि आप अपने फ़ंक्शन का उपयोग करना चाहते हैं, तो आपको सीधे 'unlist.foo' – Chrisss

+0

@ क्रिज़ को कॉल करने की आवश्यकता है, हालांकि मैंने इसे S3 के रूप में निर्यात करने के लिए 'roxygen2' का उपयोग किया है, मैंने अब स्पष्ट रूप से' unlist' को S3 के रूप में तुरंत चालू कर दिया है। यह अभी भी एक ही समस्या में परिणाम। – cdeterman

+0

'असूचीबद्ध।foo' S3 के लिए एक विधि होगी, जो किसी ऑब्जेक्ट पर लागू होगा जैसे 'foo <- struct (matrix (rnorm (16), 4), class = "foo")' लेकिन आपकी कक्षा S4 की तरह दिखती है यदि मैं हूं गलत नहीं – baptiste

उत्तर

0

मुझे डर है कि यह संभव नहीं है हूँ। unlist सूची के अलग-अलग तत्वों के प्रकारों के आधार पर इसके आउटपुट का प्रकार निर्धारित करता है। यदि सभी तत्व परमाणु हैं, जैसे कि केवल तत्व foo (एक मैट्रिक्स) है, तो यह तर्क के लिए कुछ करता है - सामान्य परमाणु वेक्टर (केवल एक ही है) के लिए कोरस तर्क और इसके अधिकांश गुण (उदा। आयाम) को भूल जाते हैं। हालांकि, यह एस 4 ऑब्जेक्ट्स (जैसे foo) का इलाज नहीं करता है, जो परमाणु वैक्टर के रूप में परमाणु वैक्टर पर आधारित होता है: इसलिए इन एस 4 ऑब्जेक्ट्स को परिणाम में बरकरार रखा जाएगा, और नतीजा प्रकार की सूची होगी। तो unlist पर पर पर लौटें। व्यवहार bind.c में सी (do_unlist) में लागू किया गया है और मुझे प्रलेखन के अनुरूप होना प्रतीत होता है।

unlist के संभावित उपयोगों के सबसेट में वांछित व्यवहार mimick करने के लिए, एक शायद, foo वस्तुओं की एक सूची के लिए एक नया वर्ग को लागू कर सकता है foo के लिए list परिभाषित करते हैं, और उसके बाद इस सूची के- foo के लिए एक नया unlist को परिभाषित वर्ग समान रूप से व्यवहार करने के लिए करता है कि कैसे अनलिस्ट का डिफ़ॉल्ट सी कार्यान्वयन परमाणु वैक्टर की सूची पर व्यवहार करता है (मैंने कोशिश नहीं की है)।

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