为什么 ifelse() return 输出单值?

Why does ifelse() return single-value output?

这两个函数应该给出相似的结果,不是吗?

f1 <- function(x, y) {
   if (missing(y)) {
      out <- x
   } else {
      out <- c(x, y)
   }
   return(out)
}

f2 <- function(x, y) ifelse(missing(y), x, c(x, y))

结果:

> f1(1, 2)
[1] 1 2
> f2(1, 2)
[1] 1

这与missing无关,而与您错误使用ifelse有关。来自 help("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.

你的 test 的 "shape" 是长度为一的向量。因此,返回一个长度为一的向量。 ifelse 不仅仅是 ifelse 的不同语法。

同样的结果发生在函数外:

> ifelse(FALSE, 1, c(1, 2))
[1] 1

函数 ifelse 设计用于矢量化参数。它测试 arg1 的第一个元素,如果为真 returns 则为 arg2 的第一个元素,如果为假则为 arg3 的第一个元素。在这种情况下,它会忽略 arg3 的尾随元素, returns 仅忽略第一个元素,这相当于本例中的 TRUE 值,这是令人困惑的部分。使用不同的参数会更清楚:

> ifelse(FALSE, 1, c(2, 3))
[1] 2

> ifelse(c(FALSE, FALSE), 1, c(2,3))
[1] 2 3

重要的是要记住,在 R 中,一切(甚至长度为 1)都是向量,并且一些函数单独处理每个元素('vectorised' 函数),而一些函数将向量作为一个整体处理。