美文网首页
R | 向量查找表

R | 向量查找表

作者: 尘世中一个迷途小书僮 | 来源:发表于2019-05-24 12:18 被阅读0次

    书接上回 判断语句-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语句都可以被查找表替代,重要的是选择合适的方式去编程。

    完。

    相关文章

      网友评论

          本文标题:R | 向量查找表

          本文链接:https://www.haomeiwen.com/subject/pokgzqtx.html