使用向量化的 if:ifelse

进行分支计算的一个替代方法是 ifelse( )。这个函数接收一个逻辑向量作为判定
条件,并且返回一个向量。对于逻辑判定条件内的每一个元素,若是 TRUE,则选择第 2
个参数 yes 中所对应的元素;若是 FALSE,则选择第 3 个参数 no 中所对应的元素。总而
言之,ifelse( ) 是 if 的向量化形式,如下所示:
ifelse(c(TRUE, FALSE, FALSE), c(1, 2, 3), c(4, 5, 6))
## [1] 1 5 6
既然 yes 和 no 两个参数可以循环使用,那么,可以就使用 ifelse( ) 重
写 check_positiv( ):
check_positive2 <- function(x){
ifelse(x,1,0)
}
check_positive( )(使用 if)和 check_positive2( )(使用 ifelse)之间的细微
差别在于:check_positive(−1) 不会明确返回某个值,而 check_positive2(−1) 则
会返回 0。当 if 语句只使用 if 而没有 else 时,无须明确返回某个值。相反,对
于 ifelse( ),因为需要指定 yes 和 no 这两个参数值,所以它总是返回一个向量。
另外,需要提醒的是,如果只是简单地将 ifelse( ) 和 if 相互替代,不能保证总是达到同
样的目的。举个例子,假设你希望基于某个条件得到一个两元素变量。如果我们使用 ifelse( ):
ifelse(TRUE, c(1, 2), c(2, 3))
## [1] 1
只返回了 yes 参数中的第 1 个元素。如果想返回 yes 参数,需要将条件改
为 c(TRUE, TRUE),只是这看起来有点别扭。
如果使用 if,看起来就自然多了:
if (TRUE) c(1, 2) else c(2, 3)
## [1] 1 2
如果要求向量化输入和输出,就会存在另一个问题:若 yes 参数是数值向量,而 no 参
数是字符向量,那么,一个混合了 TRUE 和 FALSE 的判定条件会将输出向量中的所有元素
强制转换为字符串,因此,返回结果是一个字符向量:
ifelse(c(TRUE, FALSE), c(1, 2), c("a", "b"))
## [1] "1" "b"

posted @ 2019-01-22 10:51  NAVYSUMMER  阅读(261)  评论(0编辑  收藏  举报
交流群 编程书籍