3.2 向量化if

3.2 向量化if

首先看看下面的这段代码:

if(x < 1) y <- -1 else y <- 1

这个看起来非常符合逻辑.如果x长度为1,它的输出确实符合你的预期.然而,如果x的长度大于1的话,就会有警告出现(经常被我们忽略),而且y往往不是我们想要的.下面的代码却满足我们的期望:

y <- ifelse(x < 1, -1, 1)  

从上面的说明我们可以得到两点启示:

  1. 在使用if的情况下,在R中少数几个向量(长度大于1)不受欢迎的地方之一(“:”是另外一个).
  2. 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)  

如果在ififelse之间有一个误区的话,那么它就是在ifelse适合的情况下我们总是使用if.但是学无止境,所以同样的,我们要养成 当if合适的情况下努力尝试使用ifelse.例如:

ifelse(x, character(0), ’’)   

ifelse的结果总是它第一个入参(正式的)的长度.假如x的长度是1,得到期望结果的方法是:

if(x) character(0) else ’’  

ifelse的一些值得我们注意的地方:返回的结果不仅受第一个入参的影响,而且受到第一个入参属性的影响.如果你希望返回值带有其他两个入参的属性,你需要做更多的工作.在第8.2.7轮回,我们将会看到一个关于因子的特殊的案例.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值