R语言自定义函数返回含NA向量及循环中向量元素访问问题求助
R语言自定义函数返回含NA向量及循环中向量元素访问问题求助
嗨,我来帮你捋清楚这个问题的根源哈!
首先看你贴的两个函数代码——fourth_prob和quarto_prob,除了函数名和参数名不一样,核心逻辑几乎完全一致,但你说前者返回全NA的向量,后者却能正常工作?这有点奇怪哦,因为按你贴的quarto_prob代码,它的heads也是用rep(NA, ripetizioni)初始化的,按道理也会返回全NA才对。会不会是你实际写quarto_prob的时候,不小心把初始化代码改成了rep(0, ripetizioni)?这才是解决问题的关键!
问题核心原因
你第一个函数fourth_prob的问题出在向量初始化的取值上:
你用heads=rep(NA, rip)创建了一个全是NA的向量,然后在循环里执行heads[i] = heads[i] + (sample(0:1,1)==1)。但在R里,NA和任何数值进行运算的结果还是NA,不管你后面累加多少次0或者1,heads[i]永远都会是NA,最终返回的自然就是全NA的向量了。
修复方案
把heads的初始值从NA改成0就可以解决问题了,因为0是数值型,累加操作能正常进行:
fourth_prob = function( rip ){ heads = rep(0, rip) # 这里将NA替换为0 for (i in 1:rip) { diceroll = sample(1:6, 1) for( k in 1 : diceroll){ heads[i] = heads[i] + ( sample(0:1, 1) == 1) } } return(heads) }
额外优化建议
其实这个逻辑完全可以不用嵌套循环,用R的向量化操作或者sapply来简化代码,既简洁又高效:
fourth_prob = function(rip) { # 一次性生成所有实验的骰子点数 dice_rolls <- sample(1:6, rip, replace = TRUE) # 对每个骰子点数,投掷对应次数硬币并统计正面次数 sapply(dice_rolls, function(n) sum(sample(0:1, n, replace = TRUE))) }
这样写不仅减少了手动循环的代码量,也更符合R的编程习惯哦~
备注:内容来源于stack exchange,提问作者keeperbruce
相关产品推荐
相关产品推荐

