这两个函数应该会给出类似的结果,不是吗?
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
这两个函数应该会给出类似的结果,不是吗?
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
> 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)都是向量,并且一些函数会逐个处理每个元素(称为“向量化”函数),而一些函数会将整个向量作为一个整体处理。
f2
中包含return
语句,您将获得相同的结果:f2 <- function(x, y) ifelse(missing(y), return(x), return(c(x, y)))
。 - tospig