2016-06-02 11 views
6

शीर्षक के लिए क्षमा चाहते हैं, यह सुनिश्चित नहीं है कि इस प्रश्न को और कैसे वाक्यांश दिया जाए।आर एस 4 setMethod '[' लापता तर्क अंतर?

यदि मैं कक्षा में setMethod बनाना चाहता हूं तो मैं mat[i,] और mat[i] के समान मामलों के बीच कैसे अंतर कर सकता हूं?

मैं पूर्व मैं उपयोग कर सकते हैं के लिए पता है:

setMethod("[", 
    signature(x = "foo", j = "missing", drop = "missing"), 
    function(x,i,j,drop) return(myFunc(x,i)) 
) 

मैं कैसे बाद मैं कहाँ basematrix वर्ग में के रूप में पंक्तियों लेकिन तत्वों का चयन नहीं करना चाहेंगे भेद करने के लिए एक विधि सेट कर सकते हैं?

?[ प्रलेखन को देखते हुए मैं उम्मीद निम्नलिखित की तरह कुछ काम करेगा:

setMethod("[", 
    signature(x = "foo", i = "numeric"), 
    function(x,i,j,drop) return(myFunc(x,i)) 
) 

लेकिन यह किसी भी पहले से परिभाषित तरीकों जहां j और drop याद कर रहे हैं विरोध करता है।

विचार ही किया जा रहा है

रूप
mat <- matrix(seq(9), 3, 3) 

mat[c(1,3),] 
1 4 7 
3 6 9 

mat[c(1,3)] 
[1] 1 3 

उत्तर

3

आप मैट्रिक्स पैकेज में उदाहरण के एक बहुत मिल जाएगा। यह एस 4 का उपयोग करता है और मैट्रिस के लिए नए वर्ग और विधियों को लागू करता है। जहां तक ​​मुझे पता है कि हस्ताक्षर में आप जो खोज रहे हैं उसे घोषित करने का कोई तरीका नहीं है। इसके बजाय आपको mat[1] और mat[1, ] के बीच अंतर करने के लिए फ़ंक्शन nargs का उपयोग करना होगा।

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

setMethod(
    "[", 
    signature(x = "foo", i = "missing", j = "missing", drop = "missing"), 
    function(x, i, j, drop = FALSE) { 
    x 
    } 
) 

setMethod(
    "[", 
    signature(x = "foo", i = "numeric", j = "missing", drop = "missing"), 
    function(x, i, j, ..., drop) { 
    if (nargs() == 3) [email protected][i, ] 
    else [email protected][i] 
    } 
) 

setMethod(
    "[", 
    signature(x = "foo", i = "numeric", j = "numeric", drop = "missing"), 
    function(x, i, j, ..., drop) { 
    [email protected][i, j] 
    } 
) 

mat <- new("foo", mat = matrix(seq(9), 3, 3)) 

mat[] 
mat[2:5] 
mat[1:2, ] 
mat[1:2, 2] 

हालांकि, यह आसान हो सकता है अगर आप सीधे

setClass("Matrix", contains = "matrix") 
की तरह (मैट्रिक्स पैकेज से या 'मैट्रिक्स') आधार वर्ग 'मैट्रिक्स' का विस्तार करने और कुछ करना: यहाँ एक उदाहरण है कि कैसे करने के लिए है

चूंकि आप इन विधियों को मुफ्त में प्राप्त करते हैं। उदाहरण के लिए नोट, ऊपर दिए गए कार्यान्वयन में, आपको अभी भी drop तर्क का ख्याल रखना होगा। और मूल रूप से आपको पहले से मौजूद कुछ भी करना होगा।

+0

ऐसा लगता है कि यह चाल है – cdeterman

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