R 给出函数中常见的缺失参数

R 给出函数中常见的缺失参数,r,functional-programming,eval,R,Functional Programming,Eval,我有一堆小函数,它们生成类似于rnorm或sample的随机字符串。这些函数都有公共参数,为了简单起见,假设一个公共参数是n。我想制作一个更大的函数(functional),它将n作为参数加上…,可以是任何一个小函数。此元函数使用集合n对具有此参数的小函数求值。下面是一个例子: ##小功能 fun1 <- function(n, x = 1:10) sample(x, n, TRUE) fun2 <- function(n, x = LETTERS) sample(x, n, TRU

我有一堆小函数,它们生成类似于
rnorm
sample
的随机字符串。这些函数都有公共参数,为了简单起见,假设一个公共参数是
n
。我想制作一个更大的函数(functional),它将
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, ...) {
    ## 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

combiner我到处乱搞,但从来没有接近过。我以前从未使用过
as.call
。非常感谢。
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
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