如何在R中从数据框加载数据与分布函数实现蒙特卡洛模拟?
解决文本函数名转可执行函数的问题
核心方案:用get()转换字符串函数名
直接用get()函数就能把字符串形式的函数名转换成可调用的函数对象,你的例子可以这么改:
# 定义参数向量 a <- c("rnorm", 2, 0.1) nsim <- 100 # 模拟次数 # 转换函数名并调用 sim_results <- get(a[1])(nsim, as.numeric(a[2]), as.numeric(a[3]))
注意:向量里的参数默认是字符类型,必须用as.numeric()转成数值型,否则函数会因为参数类型不匹配报错。
适配表格批量加载的场景
如果是从表格读取分布信息(比如数据框里存了分布名、参数1、参数2),可以用do.call()灵活处理不同参数数量的分布函数:
# 模拟表格数据 dist_table <- data.frame( dist_name = c("rnorm", "runif", "rpois"), param1 = c(0, 0, 5), param2 = c(1, 1, NA) ) nsim <- 100 # 批量生成模拟结果 simulations <- lapply(1:nrow(dist_table), function(row_idx) { # 获取函数对象 dist_func <- get(dist_table$dist_name[row_idx]) # 整理参数(自动过滤NA值,适配参数数量不同的函数) param_list <- as.list(c(nsim, dist_table$param1[row_idx], dist_table$param2[row_idx])) param_list <- param_list[!is.na(param_list)] # 调用函数 do.call(dist_func, param_list) }) # 给结果命名方便查看 names(simulations) <- dist_table$dist_name
为什么直接a[1](...)会失败?
a[1]返回的是字符串类型,R不会自动将字符串识别为函数对象,必须通过get()或match.fun()这类工具,把字符串映射到对应的函数本体才能调用。
内容的提问来源于stack exchange,提问作者G B
相关产品推荐
相关产品推荐

