2013-09-07 6 views
5

मैं इस तरह के एक छद्म कोड का उपयोग कर चूक के साथ कार्यों के लिए याद आ रही बहस पारित करने के लिए समाधान:क्या स्क्रैच से इलिप्सिस (`...`) ऑब्जेक्ट बनाना संभव है?

wrapperfX<-function(x) 
{ 
    ...<-if(missing(x){ 
      list() 
     }else{ 
      list(x=x) 
     } 
    targetf(...) 
} 

कितना इन बातों आर में अनुमति दी जाती है?

उत्तर

5

चाल आप do.call आप एक समारोह फोन और एक सूची के रूप तर्क निर्दिष्ट कर सकते हैं जो उपयोग करने के लिए शायद है के लिए देख रहे हैं:

wrapperfX <- function(x){ 
    dots<-if(missing(x)){ 
    list() 
    }else{ 
    list(x=x) 
    } 
    do.call(targetf,dots) 
} 

यह आपको नामित तर्कों के रूप में अच्छी तरह से करता है, तो सूची तत्वों नाम है, जिसकी मदद से ।

> do.call(log,list(x=10,base=10)) 
[1] 1 

log(x=10,base=10) 

के बराबर है समारोह आप बुला रहे हैं डॉट डॉट डॉट्स के रूप में व्यक्त किया जाता है तो तर्क मुझे उसी तरह से मिलान किया जाएगा, जैसे कि तुम डाल चाहते हैं उन्हें समारोह कॉल में।

+0

यह पूरी तरह से काम करता है। चूंकि रैपर फ़ंक्शन बहुत तेज होना चाहिए, मुझे आश्चर्य है कि यह हैकरी कितनी अक्षम है; समारोह कॉल आर + सूची निर्माण में अपेक्षाकृत महंगे हैं मुफ्त में भी नहीं है ... –

2

अपने कार्य unevaluated अभिव्यक्ति पर निर्भर करता है, तो आप, substitute उपयोग करने के लिए अंदर ... कॉल के मूल्यांकन से बचने के लिए चाहते हो सकता है [भी आप, में उचित रूप से, missing((x){ :) एक लापता कोष्टक था] आवरण।

उदाहरण:

f <- function(...) deparse(as.list(substitute(list(...)))[-1L]) 

wrap <- function(x){ 
    L <- if(missing(x)) list() else list(x) 
    do.call(f, L) 
} 

wrap2 <- function(x){ 
    L <- if(missing(x)) list() else list(substitute(x)) 
    do.call(f, L) 
} 

नोट कैसे wrap2 "स्पर्श" नहीं है तर्क:

f(1+2+3)  # "list(1 + 2 + 3)" 
wrap(1+2+3) # "list(6)" 
wrap2(1+2+3) # "list(1 + 2 + 3)" 

खाली कॉल के लिए, वे अप्रभेद्य हैं:

f()  # "list()" 
wrap() # "list()" 
wrap2() # "list()" 
+0

यह जानना अच्छा है। धन्यवाद। –

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