为什么 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
不仅仅是 if
和 else
的不同语法。
同样的结果发生在函数外:
> 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' 函数),而一些函数将向量作为一个整体处理。
这两个函数应该给出相似的结果,不是吗?
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 astest
which is filled with elements selected from eitheryes
orno
depending on whether the element oftest
isTRUE
orFALSE
.
你的 test
的 "shape" 是长度为一的向量。因此,返回一个长度为一的向量。 ifelse
不仅仅是 if
和 else
的不同语法。
同样的结果发生在函数外:
> 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' 函数),而一些函数将向量作为一个整体处理。