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

使用R中lapply生成二项分布样本时出现参数缺失错误

嘿,我来帮你看看这个问题!你遇到的错误其实是因为参数传递的方式不对,咱们一步步来修正它:

问题根源

你原来的代码里,distribuicoes用c()把函数和参数向量组合在一起,这会导致参数无法被正确识别;另外在调用函数时,参数的传递顺序和方式也错了,rbinom没拿到它需要的prob参数,所以才报错。

修正后的代码

首先,咱们重新整理分布的定义,把函数和参数列表明确分开:

# 重新定义分布:每个元素是包含函数和参数列表的子列表
distribuicoes <- list(
  normal = list(fun = rnorm, params = list(mean = 0, sd = 1)),
  binomial = list(fun = rbinom, params = list(size = 4, prob = 0.5))
)

M <- 5000
sample_sizes <- c(20, 30, 50)

# 遍历每个样本量生成数据
for (n in sample_sizes) {
  dados <- lapply(distribuicoes, function(dist) {
    # 使用do.call来正确传递参数:把样本量n和参数列表合并后传给分布函数
    replicate(M, do.call(dist$fun, c(n = n, dist$params)))
  })
  
  # 可选:把每个样本量的结果保存下来,方便后续使用
  assign(paste0("dados_n", n), dados)
  cat("已生成样本量为", n, "的模拟数据\n")
}

为什么这样改?

  • 重新构造distribuicoes:用列表嵌套列表的方式,让函数和它的参数列表清晰分离,参数是命名的,不会混乱。
  • 使用do.call:这个函数可以把参数列表展开,直接传递给目标函数。比如对于二项分布,do.call(rbinom, c(n=20, list(size=4, prob=0.5)))就等价于rbinom(n=20, size=4, prob=0.5),完美满足rbinom的参数要求。
  • 简化逻辑:去掉了不必要的as函数,直接在replicate里调用do.call,代码更易读也更可靠。

你可以运行这段代码试试,应该就能正常生成二项分布和正态分布的模拟样本啦!

内容的提问来源于stack exchange,提问作者rodrigocaet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:12:32