вы забыли назначить значение по умолчанию для 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)
}
Обратите внимание, что в этом случае использование 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