为什么ifelse()返回单值输出?

Tim*_*Tim 6 r

这两个功能应该给出类似的结果,不是吗?

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))
Run Code Online (Sandbox Code Playgroud)

结果:

> f1(1, 2)
[1] 1 2
> f2(1, 2)
[1] 1
Run Code Online (Sandbox Code Playgroud)

Rol*_*and 5

这与missing你的错误使用无关,而是与你的错误使用有关ifelse.来自help("ifelse"):

ifelse返回一个具有相同形状的值,该值test填充了从中选择的元素yesno取决于元素是否testTRUEFALSE.

你的"形状" test是一个长度为一的向量.因此,返回长度为一的向量.ifelse不只是不同的语法ifelse.


Tar*_*nnn 5

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

> ifelse(FALSE, 1, c(1, 2))
[1] 1
Run Code Online (Sandbox Code Playgroud)

该函数ifelse旨在与矢量化参数一起使用。它测试 arg1 的第一个元素,如果为 true,则返回 arg2 的第一个元素,如果为 false,则返回 arg3 的第一个元素。在这种情况下,它会忽略 arg3 的尾随元素,只返回第一个元素,这相当于TRUE这种情况下的值,这是令人困惑的部分。更清楚的是,不同的论点发生了什么:

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

> ifelse(c(FALSE, FALSE), 1, c(2,3))
[1] 2 3
Run Code Online (Sandbox Code Playgroud)

重要的是要记住,一切(甚至长度为 1)在 R 中都是一个向量,有些函数单独处理每个元素(“向量化”函数),有些函数处理整个向量。