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

11

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

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

4
这里的答案有帮助吗? - A5C1D2H2I1M1N2O1R2T1
2
我无法解释为什么,但如果在f2中包含return语句,您将获得相同的结果:f2 <- function(x, y) ifelse(missing(y), return(x), return(c(x, y))) - tospig
@DavidArenburg 我犹豫是否将其关闭为重复问题(尽管如果我能投票的话,我可能会投赞成票),因为从问题中根本不明显它们是重复的,只有从答案中才能看出来(这使得搜索变得困难)。我认为这个问题比另一个问题稍微更明显一些。 - Roland
@Roland,那么也许可以相应地编辑问题的标题?我认为“missing”在这里没有任何关系。 - David Arenburg
@DavidArenburg 和 Roland - 我更改了标题以使其更具描述性。 - Tim
2个回答

12
这与“缺失”无关,而是与你错误使用的“ifelse”相关。来自“help(“ifelse”)”:
“ifelse”返回一个与“test”形状相同的值,该值填充了从“yes”或“no”中选择的元素,具体取决于“test”的元素是“TRUE”还是“FALSE”。
你的“test”的“形状”是长度为1的向量。因此,将返回长度为1的向量。`ifelse`不仅仅是`if`和`else`的不同语法。

5
同样的结果也会在函数外面发生:
> ifelse(FALSE, 1, c(1, 2))
[1] 1

ifelse函数是为向量化参数设计的。它测试arg1的第一个元素,如果为真,则返回arg2的第一个元素,如果为假,则返回arg3的第一个元素。在这种情况下,它会忽略arg3的尾随元素,并仅返回第一个元素,该元素相当于此情况下的TRUE值,这是令人困惑的部分。使用不同的参数更清楚地了解正在发生的情况:

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

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

需要记住的重要一点是,R语言中的所有东西(即使长度为1)都是向量,并且一些函数会逐个处理每个元素(称为“向量化”函数),而一些函数会将整个向量作为一个整体处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接