这两个函数应该给出类似的结果,不是吗?
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
答案 0 :(得分:5)
这与missing
无关,而是与ifelse
的错误使用无关。来自help("ifelse")
:
ifelse
返回一个与test
形状相同的值,该值填充了从yes
或no
中选择的元素,具体取决于{{1}的元素}是test
或TRUE
。
FALSE
的“形状”是长度为一的向量。因此,返回长度为一的向量。 test
不仅仅是ifelse
和if
的不同语法。
答案 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中的向量,并且某些函数单独处理每个元素('向量化'函数),有些函数作为整体使用向量。