if-else против ifelse со списками - PullRequest
11 голосов
/ 26 февраля 2012

Почему конструкция 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"

Ответы [ 3 ]

13 голосов
/ 26 февраля 2012

Из документации 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
12 голосов
/ 27 февраля 2012

if ( cond) { yes } else { no } является управляющей структурой. Он был разработан, чтобы воздействовать на программирование, а не на обработку последовательности. Я думаю, что многие люди из SPSS или SAS, авторы которых выбрали «IF» для реализации условного присваивания в своих функциях DATA или TRANSFORM, и поэтому они ожидают, что R будет вести себя так же, тогда как R произошел из традиции программирования. Неявные циклы for встроены во многие векторизованные функции (включая ifelse).

ifelse принимает выражение, которое создает вектор логических значений в качестве первого аргумента. Второй и третий аргументы должны быть векторами равной длины, и выбирается либо первый из них, либо второй. Это похоже на команды SPSS / SAS IF, которые имеют неявный построчный режим работы.

1 голос
/ 16 февраля 2018

По какой-то причине это помечается как дубликат Почему ifelse () возвращает вывод с одним значением?

Таким образом, решение для этого вопроса:

a=3
yo <- ifelse(a==1, 1, list(c(1,2)))
yo[[1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...