Цикл возвращает ошибку: «аргумент имеет нулевую длину» - PullRequest
1 голос
/ 11 марта 2019
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 && 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 Ответ

1 голос
/ 11 марта 2019

R не работает таким образом.У вас просто есть функция напечатать слово «ИСТИНА» или «ЛОЖЬ».Вместо этого вам нужно ? Вернуть TRUE или FALSE.Рассмотрим:

return.prime <- function(d){
  if(d==1){ return(FALSE) }
  if(d==2){ return(TRUE)  }
  if(d !=2 && 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
...