gpt4 book ai didi

从省略号中删除参数/元素

转载 作者:行者123 更新时间:2023-12-04 18:57:37 26 4
gpt4 key购买 nike

我想从省略号中删除一个元素,因为我想在我的函数中手动设置它。下面的示例说明了这一点,因为鉴于我正在通过 na.rm,错误是合理的在手动和通过省略号。如何删除 na.rm从省略号,以便不会抛出错误?

mymean <- function(x, ...){

dots <- list(...)

if (is.null(dots$na.rm)) {
na_arg <- TRUE
} else {
na_arg <- dots$na.rm
}

mean(x, na.rm = na_arg, ...)

}

set.seed(10); a <- c(rnorm(20), NA)

mymean(a)
## [1] -0.06053267

mymean(a, trim = .5)
## [1] -0.08275319

mymean(a, na.rm = TRUE, trim = .1)
## Error in mean.default(x, na.rm = na_arg, ...) :
## formal argument "na.rm" matched by multiple actual arguments

最佳答案

1) lm source code of lm .跟随那个:

mymean1 <- function(x, ...){

mc <- match.call()
mc[[1]] <- as.name("mean")
if (is.null(mc$na.rm)) mc$na.rm <- TRUE
eval(mc, parent.frame())

}

mymean1(a, na.rm = TRUE, trim = .1)
## [1] -0.01886715
mymean1(a, trim = .1)
## [1] -0.01886715

2) do.call 尽管存在细微差别,即 ... 被评估,这也将起作用。在这种情况下和大多数情况下都无关紧要,但在一些不太常见的情况下可能会发生。
mymean2 <- function(x, ...) {
dots <- list(...)
if (! "na.rm" %in% names(dots)) dots$na.rm <- TRUE
do.call("mean", c(list(x), dots))
}
mymean2(a, na.rm = TRUE, trim = .1)
## [1] -0.01886715
mymean2(a, trim = .1)
## [1] -0.01886715

3) 普通 arg 但是,编写以下代码会更容易:
mymean3 <- function(x, na.rm = TRUE, ...) mean(x, na.rm = na.rm, ...)

mymean3(a, na.rm = TRUE, trim = .1)
## [1] -0.01886715
mymean3(a, trim = .1)
## [1] -0.01886715

这是编写具有不同默认值的包装器的常用方式。例如见 read.csv source code .

关于从省略号中删除参数/元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48477508/

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