if ( cond) { yes } else { no }
является структурой управления. Он был разработан для создания программных вилок, а не для обработки последовательности. Я думаю, что многие люди пришли из SPSS или SAS, авторы которых выбрали «IF» для реализации условного присвоения в своих функциях DATA или TRANSFORM, и поэтому они ожидают, что R будет вести себя одинаково, тогда как R - из традиции программирования. R неявные for-loops встроены во множество векторизованных функций (включая ifelse
).
ifelse
принимает выражение, которое строит вектор логических значений в качестве первого аргумента. Второй и третий аргументы должны быть векторами равной длины, и либо первый из них, либо второй выбирается. Это похоже на команды SPSS / SAS IF
, которые имеют неявный режим работы по строке.
Из документации ifelse:
‘ifelse’ returns a value with the same shape as ‘test’ which is
filled with elements selected from either ‘yes’ or ‘no’ depending
on whether the element of ‘test’ is ‘TRUE’ or ‘FALSE’.
Таким образом, ваш вход имеет длину один, поэтому выход усечен до длины 1.
Вы также можете увидеть это проиллюстрировано более простым пример:
ifelse(TRUE, c(1, 3), 7)
# [1] 1
По какой-то причине это помечено как дубликат . Почему ifelse () возвращает однозначный вывод?
Итак, работа для этого вопроса:
a=3
yo <- ifelse(a==1, 1, list(c(1,2)))
yo[[1]]