#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. Нет возвращаемого значения с
2. Нет. Согласно
help('for')
,for
,while
иrepeat
циклы всегда возвращаютсяNULL
. Кроме того, взгляните наifelse
функцию, я думаю, она хорошо подходит для вашего использования.3. for не возвращает значение, взгляните на
apply
семейство, если вам нужны циклы, которые возвращают значения, также использование цикла для этой задачи является излишним:ages[ages %in% age30s]
это даст вам возраст, который также можно использовать в возрасте 30 летintersect(ages, age30s)
Ответ №1:
Согласно ?print
print выводит свой аргумент и возвращает его невидимым образом (через invisible(x) ). Это универсальная функция, которая означает, что новые методы печати могут быть легко добавлены для новых классов.