2011-11-01 21 views
38

में मैं एक समारोह f कि दो पैरामीटर (p1 और p2) लेता है, तो:टेस्ट एक समारोह का एक तर्क सेट हो या आर

पैरामीटर p2 के लिए कोई मूल्य नहीं कार्य करने के लिए पारित किया गया था, तो मूल्य p1^2 के बजाय 2 का उपयोग किया जाना चाहिए। लेकिन यदि कोई मूल्य दिया गया है या नहीं, तो मैं फ़ंक्शन के भीतर कैसे पता लगा सकता हूं। समस्या यह है कि परिवर्तनीय p2 प्रारंभ नहीं किया गया है यदि कोई मूल्य नहीं था। इस प्रकार मैं p2NULL के लिए परीक्षण नहीं कर सकता।

f <- function(p1, p2) { 
    if(is.null(p2)) { 
     p2=p1^2 
    } 
    p1-p2 
} 

यह किसी भी तरह अगर p2 के लिए एक मूल्य के कार्य करने के लिए नहीं पारित किया गया था या जांच करने के लिए संभव है? (मुझे isset() - फ़ंक्शन या इसी तरह की चीजें नहीं मिल सका।)

उत्तर

46

आप इसके लिए missing() फ़ंक्शन का उपयोग करते हैं।

f <- function(p1, p2) { 
    if(missing(p2)) { 
     p2=p1^2 
    } 
    p1-p2 
} 

वैकल्पिक रूप से, आप डिफ़ॉल्ट रूप से शून्य करने के लिए p2 का मान सेट कर सकते हैं। मैं कभी-कभी उस समाधान को पसंद करता हूं, क्योंकि यह नेस्टेड कार्यों के लिए तर्क पारित करने की अनुमति देता है।

f <- function(p1, p2=NULL) { 
    if(is.null(p2)) { 
     p2=p1^2 
    } 
    p1-p2 
} 

f.wrapper <-function(p1,p2=NULL){ 
    p1 <- 2*p1 
    f(p1,p2) 
} 
> f.wrapper(1) 
[1] -2 
> f.wrapper(1,3) 
[1] -1 

संपादित करें: यदि आप के रूप में अच्छी missing() साथ तकनीकी रूप से ऐसा कर सकता है, लेकिन फिर आप f.wrapper में एक missing() बयान के रूप में अच्छी तरह से शामिल करने के लिए होगा।

+1

+1 पर आलसी मूल्यांकन पर भाग देखें। पुन: आपके द्वारा जोड़ा गया संपादित करें, आप रैपर फ़ंक्शन के माध्यम से 'गायब' कैसे हो जाएंगे? –

+0

@ जोशो'ब्रायन पासिंग 'लापता' नस्ल जटिल AFAIK है - लेकिन संभव है। यही कारण है कि इस मामले में 'नूल' इतना आसान है। – Tommy

+0

... तो 'लापता' नस्ल को पार करने के लिए एक अलग सवाल की आवश्यकता हो सकती है। – Tommy

7

मुझे लगता है कि 'गायब' करना चाहिए।

5

एक मामले में इस तरह आप भी कुछ इस तरह का उपयोग कर सकते हैं:

f <- function(p1, p2 = p1^2) { 
    p1-p2 
} 

`NULL` डिफ़ॉल्ट विकल्प के लिए http://adv-r.had.co.nz/Functions.html

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