2015-04-14 8 views
5

में सामान्य लापता तर्क दें मेरे पास छोटे कार्यों का एक गुच्छा है जो rnorm या sample के समान यादृच्छिक तार उत्पन्न करते हैं। सादगी के लिए इन कार्यों में सभी सामान्य तर्क हैं, मान लें कि एक आम तर्क n है। मैं एक बड़ा फ़ंक्शन (कार्यात्मक) बनाना चाहता हूं जो n और तर्क प्लस ... लेता है जो कि छोटे कार्यों में से कोई भी हो सकता है। यह मेटा फ़ंक्शन सेट n के साथ छोटे कार्यों का मूल्यांकन करता है यदि उनके पास यह तर्क है।कार्यात्मक

## लिटिल कार्य

fun1 <- function(n, x = 1:10) sample(x, n, TRUE) 
fun2 <- function(n, x = LETTERS) sample(x, n, TRUE) 
fun3 <- function(n, x = 50) rnorm(n, x) 
fun4 <- function(n, x = 100, y = 10) rnorm(n, x, y) 

कार्यात्मक (मेटा फंक्शन)

combiner <- function(n, ...){ 

## Where the magic needs to happen. Set n for `fun1` `fun2` and `fun4` 
## evaluate all these functions 

} 

## Here we pass `n = 6` 
combiner(
    6, 
    fun1(), 
    fun2, 
    rnorm(), 
    fun4(y=8) 
) 

मैं इसे कार्यों भले ही वे () भूल रहे हैं मूल्यांकन करने के लिए करना चाहते हैं: यहाँ एक उदाहरण है जैसा कि fun2 के साथ मामला है लेकिन यह एक अच्छी तरह से अधिक है। मुझे लगता है कि यह संभव है क्योंकि magrittr पाइप ऐसा कर सकते हैं।

## वांछित आउटपुट

list(
    fun1(6), 
    fun2(6), 
    rnorm(6), 
    fun4(6, y=8) 
) 


## OUTPUT IS SEED DEPENDANT 
## [[1]] 
## [1] 2 1 6 6 1 1 
## 
## [[2]] 
## [1] "V" "Z" "A" "F" "F" "G" 
## 
## [[3]] 
## [1] -0.91932716 -0.05833169 1.75440750 2.19959565 -0.11145315 1.32216601 
## 
## [[4]] 
## [1] 107.48747 89.55798 93.15771 111.32380 100.82104 104.07829 

उत्तर

6

यहाँ मैं यह कैसे दृष्टिकोण चाहते हैं:

combiner <- function(n, ...) { 
    ## Capture the unevaluated calls and symbols passed via ... 
    ll <- as.list(substitute(list(...)))[-1] 
    ## Process each one in turn 
    lapply(ll, FUN = function(X) { 
     ## Turn any symbols/names into calls 
     if(is.name(X)) X <- as.call(list(X)) 
     ## Add/replace an argument named n 
     X$n <- n 
     ## Evaluate the fixed up call 
     eval(X) 
    }) 
} 

combiner(6, fun1(), fun2, rnorm(), fun4(y=8)) 
# [[1]] 
# [1] 3 8 9 7 4 7 
# 
# [[2]] 
# [1] "Z" "M" "U" "A" "Z" "U" 
# 
# [[3]] 
# [1] 0.6100340 -1.0323017 -0.6895327 1.2534378 -0.3513120 0.3116020 
# 
# [[4]] 
# [1] 112.31979 91.96595 79.11932 108.30020 107.16828 89.46137 
+0

मैं हर तरह से जो खिलवाड़ किया गया था, लेकिन कभी कभी उपयोग नहीं किया 'that.I've के पास मिला as.call' पहले। धन्यवाद। –

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