书接上回 判断语句-if篇。
在上一回中,繁琐的if判断无论是写起来、读起来亦或是运行起来都十分麻烦且耗时。那么有没有什么方法可以在某种情境下代替if语句帮助我们进行条件判断呢?接下来,我们将介绍R中一种较为方便的解决方案--查找表。
上回if语句之所以判断这么多,就是因为有太多的图案类型需要判定,但是我们需要的其实就是通过判断名称--来获得数值而已。所以,完全可以生成一个向量,将名称和相应的数值一一对应。
> payouts <- c("DD"=100, "7"=80, "BBB"=40, "BB"=25, "B"=10, "C"=10, "0"=0)
> payouts
DD 7 BBB BB B C 0
100 80 40 25 10 10 0
> class(payouts)
[1] "numeric"
#该向量本质上还是一个`numeric`向量,只是我们将各个数值命名而已
然后,我们就可以采用这种方法简化score
函数:
score2 <- function(sym){
#三个图案一样的情况
if(length(unique(sym))==1){
payouts <- c("DD"=100, "7"=80, "BBB"=40, "BB"=25, "B"=10, "C"=10, "0"=0)
prize <-unname(payouts[sym[1]])
}
#三个都是有B的情况
else if(sum(sym %in% c("BBB", "BB", "B"))==3){
prize <- 5
}
#计算C的数量以及中奖金额,“C”的情况也可以进行简化
else {
prize <- c(0,2,5)[sum(sym=="C")+1]
}
#根据DD数量调整奖金
if("DD" %in% sym){
prize <- prize*2^sum(sym=="DD")
}
prize
}
顿时就有豁然开朗之感!
除了可以简化代码外,查找表还可以省点时间。if结构有几个弊端。首先,其要求R沿着if结构自上而下运行多个测试,这就执行了很多不必要的计算。其次,向量化编程与R的结合是一种更有效的编程风格(可以看到能省很多行代码),有种极简之美。
要将if结构转换成查找表,首先明确要赋的值,并将这些值存储在一个向量中。然后,提取出if结构中的各个条件语句作为选值的依据。
最后,也不是说所有if语句都可以被查找表替代,重要的是选择合适的方式去编程。
完。
网友评论