使用 && 替代 &
为判断两个骰子是否相同,move_square() 函数使用了 if 语句。
if (is_double[1] & is_double[2] & is_double[3]) {
current <- 11 # Go To Jail - square 11 == Jail
}
& 运算符会始终计算它的两个参数。也就是说,当您输入 x & y 时,R 总会尝试求出 x 和 y 的值。在某些情况下,这样做并不高效。比如,当 x 为 FALSE 时,无论 y 取何值,x & y 都为 FALSE。因此,您可以不去计算 y 来节省一些处理时间。&& 运算符正是利用了这一点:如果 y 的取值不会影响最终结果,它就不会去计算 y。
在此代码中,如果 is_double[1] 为 FALSE,我们就不需要计算 is_double[2] 或 is_double[3],因此把 & 换成 && 可以获得一定的加速。
需要注意的是,&& 只适用于单个逻辑值,即长度为 1 的逻辑向量(就像传入 if 条件那样),而 & 也适用于长度大于 1 的向量。
本练习是课程的一部分
高效 R 代码写作
练习说明
- 创建一个
improved_move()函数,其逻辑与move()类似,但使用&&。 - 使用
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)