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

时间:2018-01-27 15:51:06

标签: r ellipsis

我想从省略号中删除一个元素,因为我想在我的函数中设置它。下面的例子说明了这一点,因为我在手动和省略号中传递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 个答案:

答案 0 :(得分:4)

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