给出函数中常见的缺失参数
Give common missing argument in functional
我有一堆小函数可以生成类似于 rnorm
或 sample
的随机字符串。这些函数都有共同的参数,为了简单起见,假设一个共同的参数是 n
。我想制作一个更大的函数(函数式),它将 n
作为参数加上 ...
,它可以是任何小函数。这个元函数使用 setn
评估小函数,如果它们有这个参数的话。这是一个例子:
## 小函数
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
以下是我的处理方法:
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
我有一堆小函数可以生成类似于 rnorm
或 sample
的随机字符串。这些函数都有共同的参数,为了简单起见,假设一个共同的参数是 n
。我想制作一个更大的函数(函数式),它将 n
作为参数加上 ...
,它可以是任何小函数。这个元函数使用 setn
评估小函数,如果它们有这个参数的话。这是一个例子:
## 小函数
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
以下是我的处理方法:
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