2013-04-09 24 views
7

के अंदर से सभी फ़ंक्शन पैरामीटर की एक सूची प्राप्त करें क्या सभी फ़ंक्शन के भीतर से फ़ंक्शन पैरामीटर प्राप्त करने का कोई तरीका है?फ़ंक्शन

match.call() डिफ़ॉल्ट सेट के साथ पैरामीटर नहीं लौटाता है लेकिन ओवरराइड नहीं किया जाता है। उदाहरण के लिए:

xf <- function (a, b="Hi", c=TRUE) { 
    print(as.list(match.call(expand.dots=FALSE))) 
} 

>xf(3) 
[[1]] 
xf 

$a 
[1] 3 

मैं एक समारोह के लिए एक मौजूदा फ़ंक्शन को कॉल करने के साथ एक पैकेज लिख रहा हूँ, लेकिन मैं चूक कि मौजूदा समारोह पर नहीं हैं सेट करने में सक्षम होना चाहता हूँ। (मैं match.call से सूची का उपयोग कर, do.call के साथ अन्य समारोह में इसे पारित और वापस लौटने वाले परिणाम पर योजना बना रहा था

अद्यतन:।। एक दिलचस्प मुद्दा यह है कि एस 3 तरीकों से संबंधित है मैं एक नया S3 विधि बनाया है, और प्रयोग किया जाता है @ Ferdinand.kraft का उत्तर। as.list(environment(), all.names=TRUE) सभी। नाम तर्क सूची में . से शुरू होने वाले नाम रखता है। यह विधि प्रेषण को .Generic.Class.Method और कई अन्य समेत फ़ंक्शन पर्यावरण में कई तर्क जोड़ता है। इससे समस्याएं पैदा हो सकती हैं आप इन्हें do.call में फ़ंक्शन पर पास करते हैं। अन्य उत्तरों में से एक समाधान के आसपास बेहतर हो सकता है, लेकिन मुझेकी सादगी पसंद है।

+0

करता है 'आर्ग क्या आप चाहते हैं? –

उत्तर

10

तुम भी समारोह की शुरुआत में पर्यावरण लौट सकते हैं:

xf <- function (a, b="Hi", c=TRUE) { 
    as.list(environment(), all=TRUE) 
} 

परिणाम:

> xf(a=1) 
$a 
[1] 1 

$b 
[1] "Hi" 

$c 
[1] TRUE 
+0

मुझे सादगी पसंद है। – Seth

+0

मुझे भी। :-) और यदि कोई डॉट के साथ कोई तर्क नाम शुरू नहीं होता है तो यह और भी आसान हो सकता है - या यदि आप उन्हें पास नहीं करना चाहते हैं - उस स्थिति में आप पैरामीटर 'all = TRUE' को छोड़ सकते हैं। –

4

आप ls और mget का उपयोग कर सकते हैं। ls (डिफ़ॉल्ट रूप से), कॉलिंग फ्रेम में ऑब्जेक्ट्स सूचीबद्ध करें (इस मामले में, फ़ंक्शन के भीतर), mget इन्हें प्राप्त होगा।

जैसे

xf <- function(a,b='Hi',c){ 
    # this gets the current definitions of `a`, `b`, and `c` 
    incall <-mget(ls()) 
    incall} 

xf(3) 
## $a 
## [1] 3 
## 
## $b 
## [1] "Hi" 
## 
## $c 

फिर आप उपयोग कर सकते हैं do.call(whatever, incall)

+0

भूलभुलैया का अच्छा उपयोग। – Seth