Проблемы с назначением выходных данных операторов for и if else в R

#r

#r

Вопрос:

При использовании операторов for и if else я столкнулся с проблемой невозможности назначить выходные данные в виде вектора несколько раз, как показано в коде в первом примере. Почему в первом примере не удается присвоить вектор age30output , даже если он корректно выводится на консоль, в то время как второй пример работает? Есть ли способ заставить первый пример работать так, чтобы выходные данные могли быть назначены как вектор [1] NA 31 NA NA ?

Редактировать: в первом примере я также попытался заменить print() функцию return() только для того, чтобы она возвращала первое значение элемента [1] 22 , а также следующее сообщение об ошибке — Error: no function to return from, jumping to top level.

 ages <- c(22, 31, 26, 54)
age30s <- c(30:39)
 

Первый пример:

 > age30output <- for (i in 1:length(ages)) {
      if(ages[i] %in% age30s) {
          print(ages[i])
      } else {
          print(NA)
          }
      }
[1] NA
[1] 31
[1] NA
[1] NA
> age30output
NULL
 

Второй пример:

 > ages30output <- vector(length = 4)
> age30output <- for (i in 1:length(ages)) {
      if(ages[i] %in% age30s) {
          ages30output[i] <- ages[i]
      } else {
          ages30output[i] <- NA
          }
      }
> ages30output
[1] NA 31 NA NA
 

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

1. Нет возвращаемого значения с print

2. Нет. Согласно help('for') , for , while и repeat циклы всегда возвращаются NULL . Кроме того, взгляните на ifelse функцию, я думаю, она хорошо подходит для вашего использования.

3. for не возвращает значение, взгляните на apply семейство, если вам нужны циклы, которые возвращают значения, также использование цикла для этой задачи является излишним: ages[ages %in% age30s] это даст вам возраст, который также можно использовать в возрасте 30 лет intersect(ages, age30s)

Ответ №1:

Согласно ?print

print выводит свой аргумент и возвращает его невидимым образом (через invisible(x) ). Это универсальная функция, которая означает, что новые методы печати могут быть легко добавлены для новых классов.