0
点赞
收藏
分享

微信扫一扫

使用向量化的 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"




举报

相关推荐

0 条评论