if-else vs ifelse со списками
Почему конструкция if-else и функция ifelse () ведут себя по-другому?
mylist <- list(list(a=1, b=2), list(x=10, y=20)) l1 <- ifelse(sum(sapply(mylist, class) != "list")==0, mylist, list(mylist)) l2 <- if(sum(sapply(mylist, class) != "list") == 0){ # T: all list elements are lists mylist } else { list(mylist) } all.equal(l1,l2) # [1] "Length mismatch: comparison on first 1 components"
- Выберите NA в таблице данных в R
- Можете ли вы пройти по ссылке в R?
- Запустить скрипт VBA из R
- Точка, обрезанная по оси x в ggplot
- Как назвать переменные «на лету»?
- Участок в штабеля в R
- Написание надежного R-кода: пространства имен, маскирование и использование оператора `::`
- Сложенная гистограмма в R (ggplot2) с осью y и барами в процентах от счетчиков
- Как эффективно фильтровать фрейм данных?
- измените оба названия легенды в ggplot с двумя легендами
- R разделить числовой вектор в позиции
- Эмулировать цветовую палитру по умолчанию ggplot2
- R ggplot2 объединяется с данными шейп-файла и csv для заполнения полигонов
if ( cond) { yes } else { no }
– это структура управления. Он был разработан для создания программных вилок, а не для обработки последовательности. Я думаю, что многие люди пришли из SPSS или SAS, авторы которых выбрали «IF» для реализации условного присвоения в своих функциях DATA или TRANSFORM, и поэтому они ожидают, что R будет вести себя одинаково, тогда как R – из традиции программирования. Неявные петли R встроены в множество векторизованных функций (включая 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]]