在功能上给出常见的缺失论点

Tyl*_*ker 5 functional-programming eval r

我有一堆小函数可以生成类似于rnorm或的随机字符串sample.这些函数都有共同的参数,为了简单起见,我们可以说一个常见的论点是n.我想创建一个更大的函数(函数),它取nas和参数加上...可以是任何小函数.n如果它们具有此参数,则此元函数使用集合评估小函数.这是一个例子:

## LITTLE FUNCTIONS

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)
Run Code Online (Sandbox Code Playgroud)

功能(元功能)

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)
)
Run Code Online (Sandbox Code Playgroud)

我希望它能够评估功能,即使它们已经丢失,()就像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
Run Code Online (Sandbox Code Playgroud)

Jos*_*ien 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
Run Code Online (Sandbox Code Playgroud)