使用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
相关产品推荐
相关产品推荐

