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" 

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]] 
  • Почему X присоединяется к data.tables, не допускает полного внешнего соединения или левого соединения?
  • Объединение / объединение списков по именам элементов
  • Создание фильма из серии сюжетов в R
  • Как создать матрицу корреляции в R?
  • Что означает «Следующий объект замаскирован из« package: xxx »?
  • Преобразование classов столбцов в data.table
  • Как распространять столбцы с повторяющимися идентификаторами?
  • Как прослушивать более одного выражения события в обработчике событий Shiny eventReactive
  • Почему не рекомендуется использовать attach () в R, и что я должен использовать вместо этого?
  • Улучшить географические названия графств ggplot & maps
  • R: ggplot2 barplot и панель ошибок
  • Давайте будем гением компьютера.