2013-06-30 12 views
7

मैं कुछ डिफ़ॉल्ट तर्कों को प्रतिस्थापित करने के लिए एक रैपर फ़ंक्शन बनाना चाहता हूं।आर: इलिप्सिस तर्क का उपयोग (...)

Error in localWindow(xlim, ylim, log, asp, ...) : 
    formal argument "cex" matched by multiple actual arguments 

अब एक संदर्भ का एक सा:

यहाँ समस्या के मूल मैं के साथ संघर्ष कर रहा हूँ।

myplot <- function(x, ...) { 
    plot(x, cex= 1.5, ...) 
} 

अगर मैं myplot(1:10, cex= 2) फोन मैं ऊपर त्रुटि प्राप्त होगी: मैं इस तरह की साजिश के लिए एक आवरण समारोह को परिभाषित मान लीजिए। मैं जानता हूँ कि मैं एक सूची

l <- list(...) 

को ... बदल सकते हैं और उसके बाद मैं

if(is.null(l[["cex"]])) l[["cex"]] <- 2 

कर सकता है हालांकि, मैं कैसे इस सूची वापस अंडाकार तर्क करने के लिए "सम्मिलित" कर सकते हैं? की तरह (मैं जानता हूँ कि यह काम नहीं करेगा) कुछ:

... <- l 

संपादित करें: मैं myplot परिभाषा (@Thomas से जवाब में सुझाव के रूप में) में चूक इस्तेमाल कर सकते हैं, लेकिन मैं नहीं करना चाहता: समारोह इंटरफ़ेस अव्यवस्थित हो जाएगा। मुझे लगता है मैं उस तरह एक सहायक समारोह निर्धारित कर सकते हैं:

.myfunchelper <- function(x, cex= 2.0, ...) { 
    plot(x, cex= cex, ...) 
} 

myfunc <- function(x, ...) { 
    .myfunchelper(x, ...) 
} 

लेकिन (i) यह कम खूबसूरत है और (ii) मेरी जिज्ञासा को संतुष्ट नहीं करता है।

उत्तर

11

एक वास्तविक उत्तर:

आप प्रवंचना का एक सा के माध्यम से ऐसा कर सकते हैं। सबसे पहले, अपने फ़ंक्शन को पहले के रूप में परिभाषित करें, लेकिन फ़ंक्शन के अंदर अपने डिफ़ॉल्ट तर्कों वाली एक सूची शामिल करें। फिर आप किसी भी सूची के रूप में ... के माध्यम से जो भी तर्क आते हैं, उसे पार्स कर सकते हैं, ... में किसी भी चीज़ के साथ डिफ़ॉल्ट को प्रतिस्थापित करें और फिर do.call के माध्यम से तर्कों की अद्यतन सूची को पास करें।

myplot <- function(x, ...) { 
    args1 <- list(cex=4, main="Default Title") # specify defaults here 
    inargs <- list(...) 
    args1[names(inargs)] <- inargs 
    do.call(plot, c(list(x=x), args1)) 
} 

myplot(x=1:3) # call with default arguments 
myplot(x=1:3, cex=2, main="Replacement", xlab="Test xlab") # call with optional arguments 

में पहले टीका:

समस्या यहाँ कुछ उदाहरण कार्यों के माध्यम से देखा जा सकता है:

myplot1 <- function(x, ...) { 
    plot(x, cex= 1.5, ...) 
} 

myplot2 <- function(x, cex=3, ...) { 
    plot(x, cex=cex, ...) 
} 

myplot3 <- function(x, ...) { 
    plot(x, ...) 
} 

myplot1(1:3, cex=3) # spits your error 
myplot2(1:3, cex=3) # works fine 
myplot3(1:3, cex=3) # works fine 

myplot2 में, आप cex की एक डिफ़ॉल्ट मान निर्दिष्ट लेकिन यह बदल सकते हैं। myplot3 में, cex बस पारित किया गया है। आप दो cex तर्क के साथ myplot2 चलाते हैं, तो आप अपने समारोह (myplot1) के साथ क्या हो रहा है देखेंगे:

myplot2(1:3, cex=3, cex=1.5) # same error as above 

तो, आप plot() में किसी भी चूक की स्थापना से बचने के लिए शायद सबसे अच्छा कर रहे हैं, इसलिए तो आप कुछ भी पारित कर सकते हैं के माध्यम से myplot में।

+0

हाँ, लेकिन यह वही है जो मैं टालना चाहता हूं। वास्तविक समस्या जटिल है, और मैं फ़ंक्शन कॉल परिभाषा में डिफ़ॉल्ट डालना नहीं चाहता हूं - पहले से ही बहुत से तर्क हैं। – January

+0

मैंने उत्तर के आधार पर अपडेट किया है: http://stackoverflow.com/questions/7028385/can-i-remove-an-element-in-dot-dot-dot-and-pass-it-on/7028786# 7028786 – Thomas

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