开始使用免费开始使用

使用 && 替代 &

为判断两个骰子是否相同,move_square() 函数使用了 if 语句。

if (is_double[1] & is_double[2] & is_double[3]) {
    current <- 11 # Go To Jail - square 11 == Jail
}

& 运算符会始终计算它的两个参数。也就是说,当您输入 x & y 时,R 总会尝试求出 xy 的值。在某些情况下,这样做并不高效。比如,当 xFALSE 时,无论 y 取何值,x & y 都为 FALSE。因此,您可以不去计算 y 来节省一些处理时间。&& 运算符正是利用了这一点:如果 y 的取值不会影响最终结果,它就不会去计算 y

在此代码中,如果 is_double[1]FALSE,我们就不需要计算 is_double[2]is_double[3],因此把 & 换成 && 可以获得一定的加速。

需要注意的是,&& 只适用于单个逻辑值,即长度为 1 的逻辑向量(就像传入 if 条件那样),而 & 也适用于长度大于 1 的向量。

本练习是课程的一部分

高效 R 代码写作

查看课程

练习说明

  1. 创建一个 improved_move() 函数,其逻辑与 move() 类似,但使用 &&
  2. 使用 microbenchmark(),将 improved_move() 与之前的 move() 版本进行对比。

交互式实操练习

通过完成这段示例代码来试试这个练习。

# Example data
is_double

# Define the previous solution
move <- function(is_double) {
    if (is_double[1] & is_double[2] & is_double[3]) {
        current <- 11 # Go To Jail
    }
}

# Define the improved solution
improved_move <- function(is_double) {
    if (is_double[1] ___ is_double[2] ___ is_double[3]) {
        current <- 11 # Go To Jail
    }
}

# microbenchmark both solutions
# Very occassionally the improved solution is actually a little slower
# This is just random chance
microbenchmark(___, ___, times = 1e5)
编辑并运行代码