gpt4 book ai didi

r - 分解 `…`参数并分配给多个函数

转载 作者:行者123 更新时间:2023-12-03 09:56:17 27 4
gpt4 key购买 nike

使用以下函数foo()作为简单示例,如果可能的话,我想将...中给出的值分配给两个不同的函数。

foo <- function(x, y, ...) {
list(sum = sum(x, ...), grep = grep("abc", y, ...))
}

在以下示例中,我希望将 na.rm传递给 sum(),并且将 value传递给 grep()。但是我收到了 grep()中未使用的参数的错误。
X <- c(1:5, NA, 6:10)
Y <- "xyzabcxyz"
foo(X, Y, na.rm = TRUE, value = TRUE)
# Error in grep("abc", y, ...) : unused argument (na.rm = TRUE)

看来参数是先发送到 grep()的。那是对的吗?我认为R首先会看到并评估 sum(),然后针对这种情况返回错误。

此外,当尝试拆分 ...中的参数时,我遇到了麻烦。 sum()的形式参数为 NULL,因为它是 .Primitive,因此我不能使用
names(formals(sum)) %in% names(list(...))

我也不想假设来自
names(formals(grep)) %in% names(list(...))

将自动传递给 sum()

如何安全有效地将...参数分配给多个函数,以便不进行不必要的评估?

从长远来看,我希望能够将其应用于带有一长串 ...参数的函数,类似于 download.file()scan()

最佳答案

单独的列表如果您真的想将不同的参数集传递给不同的函数,那么指定单独的列表可能更干净:

foo <- function(x, y, sum = list(), grep = list()) {
list(sum = do.call("sum", c(x, sum)), grep = do.call("grep", c("abc", y, grep)))
}

# test

X <- c(1:5, NA, 6:10)
Y <- "xyzabcxyz"
foo(X, Y, sum = list(na.rm = TRUE), grep = list(value = TRUE))

## $sum
## [1] 55
##
## $grep
## [1] "xyzabcxyz"

混合列表/ ... 另一种方法是,我们可以将...用于其中一个,然后将另一个指定为列表,特别是在其中一个经常使用而另一个不经常使用的情况下。常用的将通过...传递,不常用的将通过列表传递。例如
foo <- function(x, y, sum = list(), ...) {
list(sum = do.call("sum", c(x, sum)), grep = grep("abc", y, ...))
}

foo(X, Y, sum = list(na.rm = TRUE), value = TRUE)

以下是来自R本身的混合方法的几个示例:

i) mapply函数使用 ...MoreArgs列表采用这种方法:
> args(mapply)
function (FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE)
NULL

ii) nls也使用 ...control列表使用此方法:
> args(nls)
function (formula, data = parent.frame(), start, control = nls.control(),
algorithm = c("default", "plinear", "port"), trace = FALSE,
subset, weights, na.action, model = FALSE, lower = -Inf,
upper = Inf, ...)
NULL

关于r - 分解 `…`参数并分配给多个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25376197/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com