You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 14:25:28