-2

我无法让 na.rm 表现出我想要的样子。我正在练习编写函数,目前正在编写平均值函数。我的测试向量是 t <- c(12,14, NA, 1) 我的两个测试是

  my.mean(t)
  my.mean(t, na.rm=TRUE) 

我的第一个函数通过了测试,但测试 2 仍然返回 NA(应该是 9)

my.mean <- function(x, na.rm) {
 stopifnot(is.numeric(x))
 answer <- sum(x)/length(x)
 return(answer)
}

然后我更改了适用于第二个测试的函数并返回 9 但第一个测试返回 Error in my.mean(t.2) : argument "na.rm" is missing, with no default

my.mean <- function(x, na.rm) {
    stopifnot(is.numeric(x))
    if na.rm=TRUE {na.omit()}
    answer <- sum(x)/length(x)
    return(answer)
}
4

2 回答 2

1

na.rm您忘记在第二个函数中分配默认值。一个好的做法应该是添加一个默认值(例如TRUE)。此外,请注意,您的逻辑应该是==而不是=(并且在括号中)并且na.omit应该应用x并返回:

my.mean <- function(x, na.rm = TRUE) {
    stopifnot(is.numeric(x))
    if (na.rm==TRUE) {x <- na.omit(x)}
    answer <- sum(x)/length(x)
    return(answer)
}

如果您希望在函数中使用默认值,您可以missing()在 if 语句中使用该函数:

my.mean <- function(x, na.rm) {
    stopifnot(is.numeric(x))
    if(!missing(na.rm) && na.rm == TRUE) {
        x <- na.omit(x)
    }
    answer <- sum(x)/length(x)
    return(answer)
}

请注意,在这种情况下, usingna.rm = FALSE应该返回NA,因为sum(t) = NA

my.mean(t)
#[1] NA
my.mean(t, na.rm = TRUE)
#[1] 9
my.mean(t, na.rm = FALSE)
#[1] NA
于 2018-11-20T03:54:52.680 回答
0

您得到的错误只是说明您已经定义了一个参数(na.rm)而没有给它一个默认设置。在这种情况下,如果您没有在调用中明确地给参数一个设置,函数就会失败。

要为您的论点提供默认值,请执行以下操作:

my.mean<-function(x, na.rm=FALSE) ...

这将使默认值 FALSE。

于 2018-11-20T03:55:50.337 回答