3.2 向量化if
首先看看下面的这段代码:
if(x < 1) y <- -1 else y <- 1
这个看起来非常符合逻辑.如果x长度为1,它的输出确实符合你的预期.然而,如果x的长度大于1的话,就会有警告出现(经常被我们忽略),而且y往往不是我们想要的.下面的代码却满足我们的期望:
y <- ifelse(x < 1, -1, 1)
从上面的说明我们可以得到两点启示:
- 在使用if的情况下,在R中少数几个向量(长度大于1)不受欢迎的地方之一(“:”是另外一个).
- ifelse在这这种情况下(注:变量为向量)你所想要的(尽管在这种情况下,会有更直接的方式).
重新回想一下我们在第二轮回(12页)所看到的:
hit <- NA
for(i in 1:one.zillion)
{
if(runif(1) < 0.3) hit[i] <- TRUE
}
一个使上边的操作更有效率的替代方案是:
ifelse(runif(one.zillion) < 0.3, TRUE, NA)
如果在if和ifelse之间有一个误区的话,那么它就是在ifelse适合的情况下我们总是使用if.但是学无止境,所以同样的,我们要养成 当if合适的情况下努力尝试使用ifelse.例如:
ifelse(x, character(0), ’’)
ifelse的结果总是它第一个入参(正式的)的长度.假如x的长度是1,得到期望结果的方法是:
if(x) character(0) else ’’
ifelse的一些值得我们注意的地方:返回的结果不仅受第一个入参的影响,而且受到第一个入参属性的影响.如果你希望返回值带有其他两个入参的属性,你需要做更多的工作.在第8.2.7轮回,我们将会看到一个关于因子的特殊的案例.