gpt4 book ai didi

r - 让函数中的函数从省略号中提取它期望的参数并忽略所有其他?

转载 作者:行者123 更新时间:2023-12-01 23:06:59 26 4
gpt4 key购买 nike

Advanced R给出了一个简单的“点点点”示例,以及如何将命名参数传递给函数内的函数:

i01 <- function(y, z) {
list(y = y, z = z)
}

i02 <- function(x, ...) {
i01(...)
}

str(i02(x = 1, y = 2, z = 3))
# List of 2
# $ y: num 2
# $ z: num 3

这种方法在内部函数接受所有通过省略号提供的参数时有效。例如,添加内部函数不使用的参数会导致错误:

i01 <- function(y, z) {
list(y = y, z = z)
}

i02 <- function(x, ...) {
i01(...)
}

# Errors since i01() receives j, which it doesn't know how to handle
str(i02(x = 1, y = 2, z = 3, j = 4))
# Error in i01(...) : unused argument (j = 4)

我找到了一个解决这个问题的方法,在现实世界中使用时会变得非常冗长(例如想象一下有 > 十几个参数):

i01 <- function(y, z) {
list(y = y, z = z)
}

i02 <- function(x, ...) {
ellip <- list(...)
i01(
if(!is.null(ellip$y)){ ellip$y },
if(!is.null(ellip$z)){ ellip$z }
)
}

str(i02(x = 1, y = 2, z = 3, j = 4))
# List of 2
# $ y: num 2
# $ z: num 3

问题

是否有一种优雅的方式告诉函数内的函数 i) 查看 ... 和 ii) 提取它识别的所有内容并忽略其他所有内容?

最佳答案

我不会称之为优雅,但这是一种实现方式:

i02 <- function(x, ...) {
i01args <- list(...)[c("y", "z")]
do.call(i01, i01args)
}

这假设您将始终在 ... 中包含 yz。如果它们是可选的,你可以做类似的事情

i02 <- function(x, ...) {
allargs <- list(...)
i01args <- allargs[which(names(allargs) %in% c("y", "z"))]
do.call(i01, i01args)
}

这个版本丢失了未命名的参数。

一般来说我尽量避免这种构造。当您想将可选参数传递给两个不同的函数时,有时需要这样做,例如i02 同时调用 i01i03。但这取决于这两个函数的参数名称是否完全不同。如果 i01i03 都有一个名为 w 的参数,您怎么知道它们中的哪一个应该接收它?一个更好的结构是这样的

i02 <- function(x, i01args = list(), i03args = list()) {
do.call(i01, i01args)
do.call(i03, i03args)
}

关于r - 让函数中的函数从省略号中提取它期望的参数并忽略所有其他?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70694019/

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