R语言Miner函数修改遇阻:需返回sum(r)除以2的出现次数
解决R语言Miner函数修改问题
我明白你遇到的问题了——你想把函数返回值从sum(r)改成sum(r)除以r中数字2的出现次数,但之前尝试的方法都失效,核心原因是原来的函数最后返回的是sum(r)这个数值,而不是构建出来的向量r本身,当你在return里直接用sum(r)/sum(r==2)时,r已经被求和变成单个数字,自然无法统计原向量中2的个数。
修改后的函数代码
Miner = function(n) { x = sample(c(2,3,5), 1, replace = TRUE, prob = c(1/3,1/3,1/3)) if (n == 0) { r = 0 } else if (x == 2) { r = c(2, Miner(n - 1)) } else if (x == 3) { r = c(3, Miner(n)) } else if (x == 5) { r = c(5, Miner(n)) } # 计算总和与2的出现次数 total_sum = sum(r) count_2 = sum(r == 2) # 处理除以0的边界情况(避免无2时报错) if (count_2 == 0) { warning("序列中未找到数字2,返回NA") return(NA) } return(total_sum / count_2) }
关键修改说明
- 保留向量
r的完整结构:在计算总和和2的个数之前,我们没有直接对r求和返回,而是先保留了递归构建的完整向量,这样sum(r == 2)才能正确统计向量中所有等于2的元素数量(每个元素判断后返回TRUE/FALSE,求和后就是出现次数)。 - 添加边界处理:如果递归生成的序列中没有2,直接除以0会报错,所以加了判断逻辑,返回NA并给出警告提示。
额外提醒
注意函数中的递归逻辑:当抽到3或5时,调用的是Miner(n)(n不递减),这可能导致无限递归(比如一直抽到3/5,永远触发不了n==0的终止条件),如果这不是你的预期逻辑,可以考虑把Miner(n)改成Miner(n-1)来保证递归能终止。
内容的提问来源于stack exchange,提问作者user3422147
相关产品推荐
相关产品推荐

