вы можете получить доступ к реализации ifelse
, которая
function (test, yes, no)
{
if (is.atomic(test)) {
if (typeof(test) != "logical")
storage.mode(test) <- "logical"
if (length(test) == 1 && is.null(attributes(test))) {
#... let's skip this part..
}
}
else test <- if (isS4(test))
methods::as(test, "logical")
else as.logical(test)
ans <- test
len <- length(ans)
ypos <- which(test)
npos <- which(!test)
if (length(ypos) > 0L)
ans[ypos] <- rep(yes, length.out = len)[ypos]
if (length(npos) > 0L)
ans[npos] <- rep(no, length.out = len)[npos]
ans
}
<bytecode: 0x00000123e6b7d3a0>
<environment: namespace:base>
Итак, да, это потому, что ifelse
векторизовано - в частности, по условию - и возвращаемый объект ans
инициализируется как вектор такой же длины, что и условие.
Описание ifelse
состояний
ifelse возвращает значение с той же формой, что и у test который заполняется элементами, выбранными из да или нет, в зависимости от того, является ли элемент теста ИСТИНА или ЛОЖЬ.
Пусть test <- TRUE
. Интересные строки
ypos <- which(test)
rep(numeric(0), length.out = 1)[ypos]