R语言roll2函数返回样本值而非求和结果的问题排查
解析R语言roll2函数初始版本出错的原因
错误代码的实际逻辑
你初始编写的函数,去掉控制台提示符+后,实际代码如下:
roll2 <- function(bones) { dice <- sample(bones, size = 2, replace = TRUE) + sum(dice) }
出错原因拆解
逻辑错误:赋值语句的误用
你原本想先通过sample生成两个骰子值存入dice,再计算它们的和返回,但错误地把sum(dice)和sample的结果用+运算符合并到了同一个赋值语句里。变量作用域的问题
执行sum(dice)时,函数内部的dice还未被定义,R会向上查找父环境(通常是全局环境)中是否存在同名变量。如果你的全局环境里之前定义过dice(比如测试时留下的),R就会用这个全局变量的求和结果,和sample生成的两个数值分别相加,最终得到一个长度为2的向量赋值给dice——而函数默认返回最后一行的赋值结果,所以你得到的是两个骰子值加全局dice和的结果,而非你预期的当前两个骰子值的和。修改后的正确逻辑
修改后的函数把代码拆分为两行:
roll2 <- function(bones) { dice <- sample(bones, size = 2, replace = TRUE) sum(dice) }
先完成dice的赋值,此时函数内部已经有了dice变量,再执行sum(dice)就能正确计算当前两个骰子值的和,函数返回这个单个数值,符合预期。
关于参数传递的疑问
你担心的“未显式指定bones参数”不是问题,R支持位置参数传递,只要传入的参数顺序和函数定义的参数顺序一致,就可以正常运行,所以最后一行roll2(1:20)能正常工作是完全合理的。
内容的提问来源于stack exchange,提问作者Troy
相关产品推荐
相关产品推荐

