'пропущенное значение там, где требуется ИСТИНА / ЛОЖЬ' - PullRequest
0 голосов
/ 02 октября 2018

Я получил ошибку

Error in if (x[i] == 0 && x[i - 1] > 0) { : 
  missing value where TRUE/FALSE needed

при запуске этой функции на числовом векторе

number_rn <- function(x) {
  a <- 0
  for (i in 1:length(x)) {
    if (x[i] == 0 && x[i-1] > 0) {
      a <- a +1
    }
  }
  print(a)
}

Однако следующая функция работает нормально:

number_rr <- function(x) {
  a <- 0
  for (i in 1:length(x)) {
    if (x[i] > 0 && x[i-1] > 0) {
      a <- a +1
    }
  }
  print(a)
}

Из предыдущих ответов на аналогичные вопросы я отмечаю, что это может произойти, если условное выражение if не имеет результата TRUE или FALSE, но я не считаю, что это имеет место в моем примере.Что может быть причиной этой ошибки?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Есть несколько проблем с циклом for (даже если x не содержит значений NA):

  1. В первой итерации (i == 1), x[i-1] относитсяв x[0], который не определен, так как индексирование в R начинается с 1.
  2. Код использует цикл for, где могут использоваться векторизованные функции.

К сожалению, запускцикл в i == 2, то есть for (i in 2:length(x)), не защищен от ошибок в случае одноэлементного вектора, где length(x) == 1.

Я предлагаю использовать векторизованную версию

number_rn_vec <- function(x) {
  n <- length(x)
  sum(x[2:n] == 0 & x[1:(n - 1)] > 0, na.rm = TRUE)
}

Это вернет a без ошибок для многих случаев использования:

sapply(
  list(
    c(),
    c(1),
    c(1, 0),
    c(1, 0, 3),
    c(0, 1, 0, 3),
    c(NA, 1, 0, 3),
    c(1, NA, 0, 3),
    c(1, 0, NA, 3),
    c(1, 0, 3, NA)
  ),
  number_rn_vec
)
[1] 0 0 1 1 1 1 0 1 1
0 голосов
/ 02 октября 2018

Это наиболее вероятно, потому что ваш вектор x имеет значения NULL или NA.Посмотрите, что происходит, когда я пытаюсь выполнить условие if со значениями NULL -

x <- NULL
if (x == 0 && x > 5) print("yes")

Убедитесь, что удалили все NA или NULL с помощью is.na () или is.null (), и у вас все будет в порядке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...