Цикл возвращает ошибку: ‘аргумент имеет нулевую длину’

#r #runtime-error

#r #время выполнения-ошибка

Вопрос:

 i <- 2
j <- 0
for (i in 2:1000) {
  if(return.prime(i)){j = j   1}
  i = i   1
}
  

Я хочу проверить, сколько существует простых чисел от 1 до 1000, используя мою собственную функцию return.prime , которая возвращает TRUE, когда вводимое число является простым, и FALSE, когда вводимое число не является простым. return.prime Функция — это приведенная ниже функция, и она верна.

 return.prime <- function(d){
  if(d ==1 ){print(FALSE)}
  if (d == 2){
    print(TRUE)
  }
  if(d !=2 amp;amp; d!=1){
      if(any(d %% (2:(d-1)) == rep(0,d-2))==TRUE){
        print(FALSE)}
      else
        print(TRUE)
  }
}
  

Проблема в том, что когда я запускаю свою программу, она говорит:


 [1] TRUE
Error in if (return.prime(i)) { : argument is of length zero
  

Я не знаю, что вызывает нулевую длину.

Ответ №1:

R таким образом не работает. Вы просто заставляете функцию печатать слово «TRUE» или «FALSE». Вместо этого вам нужно ?верните TRUE или FALSE . Рассмотрим:

 return.prime <- function(d){
  if(d==1){ return(FALSE) }
  if(d==2){ return(TRUE)  }
  if(d !=2 amp;amp; d!=1){
      if(any(d %% (2:(d-1)) == rep(0,d-2))==TRUE){
        return(FALSE)
      } else{
        return(TRUE)
      }
  }
}

i <- 2
j <- 0
for (i in 2:1000) {
  if(return.prime(i)){j = j   1}
  i = i   1
}
j  # [1] 168
  

Комментарии:

1. @CatKatherine, если это решило вашу проблему, вы могли бы принять это, щелкнув галочку под итогом голосования слева от нее.