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

时间:2015-01-05 11:27:05

标签: 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))

结果:

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

2 个答案:

答案 0 :(得分:5)

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

  

ifelse返回一个与test形状相同的值,该值填充了从yesno中选择的元素,具体取决于{{1}的元素}是testTRUE

FALSE的“形状”是长度为一的向量。因此,返回长度为一的向量。 test不仅仅是ifelseif的不同语法。

答案 1 :(得分:1)

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

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

函数ifelse设计用于向量化参数。它测试arg1的第一个元素,如果是,则返回arg2的第一个元素,如果为false则返回arg3的第一个元素。在这种情况下,它忽略arg3的尾随元素,并仅返回第一个元素,在这种情况下,它等同于TRUE值,这是令人困惑的部分。使用不同的论点更清楚:

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

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

重要的是要记住,所有内容(甚至长度为1)都是R中的向量,并且某些函数单独处理每个元素('向量化'函数),有些函数作为整体使用向量。