我在使na.rm表现出我想要的方式时遇到问题。我正在练习编写函数,目前正在编写平均值函数。
我的测试向量是t <- c(12,14, NA, 1)
我的两个测试是
my.mean(t)
my.mean(t, na.rm=TRUE)
我的第一个函数通过了测试1,但是对于测试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)
}
答案 0 :(得分: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)
}
如果希望在函数中使用默认值,则可以在if语句中使用missing()
函数:
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)
}
请注意,在这种情况下,使用na.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
答案 1 :(得分:0)
您得到的错误只是说明您已定义参数(na.rm),而没有为其提供默认设置。在这种情况下,如果您未在调用中显式地给参数设置设置,则该函数将失败。
要为您的参数提供默认值,请执行以下操作:
my.mean<-function(x, na.rm=FALSE) ...
这将成为默认值FALSE。