आर

2012-04-22 7 views
13

में अप्रयुक्त तर्क R में, क्या सॉफ़्टवेयर इस तथ्य को अनदेखा कर सकता है कि मॉड्यूल चलाए जाने पर अप्रयुक्त तर्कों को परिभाषित किया गया हो?आर

उदाहरण के लिए, मेरे पास एक मॉड्यूल multiply(a,b) है, जो a और b का उत्पाद देता है।

multiply(a=20,b=30,c=10) 

इस पर एक त्रुटि रिटर्निंग सिर्फ एक सा अनावश्यक लगता है, के बाद से आवश्यक आदानों a और b निर्दिष्ट किया गया है: अगर मैं तो जैसे मॉड्यूल फोन मैं एक त्रुटि प्राप्त होगा। क्या इस बुरे व्यवहार से बचना संभव है?

c निर्दिष्ट करना बंद करने के लिए एक आसान समाधान होगा, लेकिन यह जवाब नहीं देता है कि R इस तरह व्यवहार क्यों करता है। क्या इसे हल करने का कोई और तरीका है?

+1

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

+0

सबसे पहले, यह एक फ़ंक्शन एक मॉड्यूल नहीं है। दूसरा, आपके कार्य को कैसे पता चलता है कि अतिरिक्त तर्कों के साथ क्या करना है? मुझे लगता है कि जवाब सही है, लेकिन यह वास्तव में डॉट्स (उर्फ "...") का उपयोग करने के तरीके के बारे में और अधिक स्पष्ट होना चाहिए। – geneorama

उत्तर

23

बदलें गुणा की परिभाषा अतिरिक्त अज्ञात तर्क ले रहे हैं:

multiply <- function(a, b, ...) { 
    # Original code 
} 
7

एक दृष्टिकोण ... जो परंपरागत रूप में निर्दिष्ट तर्क पारित करने के लिए प्रयोग किया जाता है जोड़ने के लिए (जो मैं कल्पना नहीं कर सकते अच्छा प्रोग्रामिंग अभ्यास है) है एक समारोह दूसरे के लिए। अपने कार्य परिभाषा ...:

> multiply <- function(a,b) a*b 
> multiply(a = 2,b = 4,c = 8) 
Error in multiply(a = 2, b = 4, c = 8) : unused argument(s) (c = 8) 
> multiply2 <- function(a,b,...) a*b 
> multiply2(a = 2,b = 4,c = 8) 
[1] 8 

आप ... के बारे में अधिक पढ़ सकते हैं here

+0

आपको क्यों लगता है कि यह बुरा अभ्यास होगा? (असहमत नहीं, सिर्फ जिज्ञासु।) मुझे लगता है कि मैंने बहुत सारे आर दस्तावेज पढ़े हैं जहां '...' तर्क को अनदेखा किया जाता है, जो लोगों को समय-समय पर ऐसा करने का सुझाव देता है। – joran

+0

... उप-कार्यों, विशेष रूप से विधियों को पास करने का इरादा है, जहां तर्क की आवश्यकता (या स्वीकृत) सूची उस समय ज्ञात नहीं है जब फ़ंक्शन लिखा गया हो। यदि आप ... नीचे की ओर जाते हैं, तो आपको गहरे स्तर पर "अप्रयुक्त तर्क" त्रुटि मिल जाएगी। आम तौर पर, यह नहीं जानते कि आप तर्क का उपयोग कर रहे हैं या नहीं, भ्रम पैदा करते हैं। –

+0

और यह सिर्फ मुझे मारा कि मैं अक्सर सी ++ आभासी तरीकों के साथ पर्याप्त करता हूं। तर्क सूची निश्चित रूप से तय की गई है, लेकिन कुछ ऑब्जेक्ट विधियों को सभी तर्कों की आवश्यकता नहीं है। –

5

प्रयोग की जाने वाली आप डॉट्स इस्तेमाल कर सकते हैं करना है।

myfun <- function(a, b, ...){ 
    cat(a,b) 
} 

myfun(a=4,b=7,hello=3) 

# 4 7 
0

मुझे आपके जैसा ही समस्या थी। मेरे पास तर्कों की एक लंबी सूची थी, जिनमें से अधिकांश अप्रासंगिक थे। मैं में कठिन कोड उन्हें नहीं करना चाहता था। यह है कि मैं क्या

library(magrittr) 
do_func_ignore_things <- function(data, what){ 
    acceptable_args <- data[names(data) %in% (formals(what) %>% names)] 
    do.call(what, acceptable_args %>% as.list) 
} 

do_func_ignore_things(c(n = 3, hello = 12, mean = -10), "rnorm") 
# -9.230675 -10.503509 -10.927077