2015-03-09 8 views
6

मैं एक ऐसा फ़ंक्शन लिखना चाहता हूं जो उसके इनपुट में दो अलग-अलग सांख्यिकीय तरीकों में से एक को लागू करता हो। प्रक्रिया में, मैंने विभिन्न कार्यों के कुछ व्यवहार को देखा जो मुझे समझ में नहीं आ रहा है। समारोह मैं निम्नलिखित गुण होना चाहिए लिखना चाहते हैं: तर्क डिफ़ॉल्ट पर छोड़ दिया जाता है, तोmatch.arg() का उपयोग करके त्रुटि के बिना डिफ़ॉल्ट मानों का मिलान वेक्टर [आर]

  • यह एक डिफ़ॉल्ट मान (ताकि उपयोगकर्ता देख सकते हैं जो तरीके उपलब्ध हैं)
  • के रूप में एक सदिश होना चाहिए मूल्य, तो दो तरीकों में से पहले किया जाना चाहिए
  • उपयोगकर्ता मैन्युअल तरीकों में से एक सदिश की आपूर्ति है, तो समारोह एक त्रुटि

मूल रूप से देना चाहिए, मैं समारोह ख करना चाहते हैं cor की तरह छेड़छाड़ आर में होती है, आपके पास एक डिफ़ॉल्ट मान method = c("pearson", "kendall", "spearman") है, और method निर्दिष्ट किए गए कार्यों को पियरसन सहसंबंध की गणना की गई है। यदि उपयोगकर्ता एक साथ कई विधियों के लिए पूछता है, तो फ़ंक्शन एक त्रुटि देता है।

cor पर देखकर, यह match.arg(method) का उपयोग करके किया जाता है। यह व्यवहार यहाँ दर्शाया गया है:

x <- y <- 1:5 

cor(x, y, method="pearson") 
# = 1 
cor(x, y, method="kendall") 
# = 1 
cor(x, y, method=c("pearson","kendall")) 
# gives an error 

मैं अपने खुद के समारोह लेखन, भी match.arg(method) उपयोग करने की कोशिश, लेकिन मैंने महसूस किया कि परिणाम किसी भी तरह अलग है। method के लिए वेक्टर चुनते समय भी, फ़ंक्शन किसी त्रुटि के साथ समाप्त नहीं होता है, लेकिन पहली विधि के परिणाम देता है।

यह यहाँ दर्शाया गया है:

myfun <- function(x, method=c("add","multiply")){ 
    method <- match.arg(method) 
    if(method=="add") return(sum(x)) 
    if(method=="multiply") return(prod(x)) 
} 

x <- 1:5 

myfun(x, method="add") 
# = 15 
myfun(x, method="multiply") 
# = 120 
myfun(x, method=c("add","multiply")) 
# = 15 

मैं इस व्यवहार को समझ में नहीं आता है, और मुझे खुशी है कि अगर तुम मुझे यहाँ से बाहर मदद कर सकता है किया जाएगा। Google पर मेरे प्रयासों से, मुझे एहसास हुआ कि यह गैर-मानक मूल्यांकन से संबंधित हो सकता है, लेकिन मैं अभी तक दो और दो को एक साथ नहीं रख सकता।

अग्रिम धन्यवाद, आपकी मदद बहुत सराहना की है!

चीयर्स!

संपादित करें:

मैं कर सकता भी फिर से वाक्यांश मेरे सवाल:

क्या शक्तिशाली टोना cor कि यह रिटर्न पियर्सन सहसंबंध जब method आपूर्ति नहीं की गई है, लेकिन यह एक त्रुटि जब देता है कि क्या करता है method = c("pearson", "kendall", "spearman") स्पष्ट रूप से निर्दिष्ट है?

उत्तर

6

यदि choices और argsmatch.arg में समान हैं, तो पहला तत्व वापस आ गया है।

क्योंकि डिफ़ॉल्ट तर्क मिलान विकल्पों को आर्ग सेट हो जाएगा, इस 'लंबाई एक जब तक several.ok सही है' नियम का एक अपवाद के रूप में अनुमति दी है, और रिटर्न: अन्यथा arg लंबाई 1. होने के लिए match.arg से है पहला तत्व

match.arg(c("pearson", "kendall", "spearman"), c("pearson", "kendall", "spearman")) 
## [1] "pearson" 
match.arg(c("pearson", "kendall"), c("pearson", "kendall", "spearman")) 
## Error in match.arg(c("pearson", "kendall"), c("pearson", "kendall", "spearman")) : 
## 'arg' must be of length 1 

आप एक डमी तर्क का उपयोग कर अपने वांछित व्यवहार प्राप्त कर सकते हैं:

myfun <- function(x, method=c("add","multiply","other.return.error")){ 
    method <- match.arg(method) 
    if("other.return.error" %in% method) stop("this option should not be used") 
    if(method=="add") return(sum(x)) 
    if(method=="multiply") return(prod(x)) 
} 
+0

क्या मैं आपको सही ढंग से समझता हूं कि 'cor' और' myfun' का व्यवहार भिन्न होता है क्योंकि मैंने दो-तत्व वेक्टर के लिए परीक्षण किया है, जहां 'cor' एक त्रुटि देता है क्योंकि इसका डिफ़ॉल्ट तर्क लंबाई 3 है, और 'myfun' बिना त्रुटि के चलाता है क्योंकि इसका डिफ़ॉल्ट तर्क लंबाई 2 है? – SimonG

+0

"वांछित" व्यवहार वास्तव में प्रश्न का हिस्सा नहीं था। मैंने स्वयं को हल किया है कि 'लापता (विधि)' का उपयोग करके 'विधि' की आपूर्ति की जाती है और 'स्टॉप' का उपयोग करके त्रुटि को प्रिंट करके अगर इसे लम्बाई से आपूर्ति की जाती है> 1. इस तरह मुझे डमी तर्क की आवश्यकता नहीं है मैन पेजों में भी दिखाएं। – SimonG

+0

हां, 'cor' और' myfun' का व्यवहार डिफ़ॉल्ट तर्कों की लंबाई के कारण भिन्न होता है। और मुझे लगता है कि वांछित व्यवहार सवाल का हिस्सा नहीं था। मैंने आपके लिए जरूरी समाधान नहीं जोड़ा, लेकिन अन्य लोगों के लिए जो इस प्रश्न को पा सकते हैं और अभी तक एक संतोषजनक समाधान नहीं मिला है। – shadow

1

मुख्य प्रश्न (ऊपर देखें) @shadow द्वारा उत्तर दिया गया था।

myfun के लिए वांछित व्यवहार होने का एक और तरीका है अगर method या आपूर्ति नहीं की और एक त्रुटि मुद्रण अगर यह स्पष्ट एक से अधिक तत्व के साथ आपूर्ति की थी एक जाँच करने के लिए है।

myfun <- function(x, method=c("add","multiply")){ 
    if(!missing(method) & length(method)>1) stop("Only one 'method' allowed.") 
    method <- match.arg(method) 
    if(method=="add") return(sum(x)) 
    if(method=="multiply") return(prod(x)) 
} 

x <- 1:5 

myfun(x) 
# = 15 
myfun(x, method="add") 
# = 15 
myfun(x, method="multiply") 
# = 120 
myfun(x, method=c("add","multiply")) 
# gives error 

इस अपवाद में match.arg @shadow द्वारा बताया गतिरोध उत्पन्न जो समारोह हो सकता है नहीं कारण किसी त्रुटि के एक सदिश की आपूर्ति करके। इसके बजाय, यह त्रुटि तुरंत दी गई है।

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