Проблемы с na.rm = TRUE с и без оператора if - PullRequest
0 голосов
/ 20 ноября 2018

У меня проблемы с тем, чтобы na.rm вел себя так, как я хочу.Я практикую написание функций и в настоящее время пишу функцию для среднего.Мой тестовый вектор t <- c(12,14, NA, 1) мои два теста

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

моя первая функция прошла тестовую, но все равно была возвращена NA для теста 2 (должно быть 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)
}

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Ошибка, которую вы получаете, просто говорит о том, что вы определили аргумент (na.rm), не задавая его по умолчанию. В таком случае, если вы явно не задаете аргументу параметр в вызове, функция завершается ошибкой.

Чтобы задать аргумент по умолчанию, сделайте что-то вроде:

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

Это сделает FALSE по умолчанию.

0 голосов
/ 20 ноября 2018

вы забыли назначить значение по умолчанию для 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
...