如何在R中用pmap结合自定义函数批量处理tibble中的函数调用?
解决方案
问题根源
你遇到的pmap()错误,本质是函数参数名与数据框列名不匹配:你的tibble第一列名为fname(无前缀点),但demo_4函数的第一个参数是.fname(带前缀点)。pmap()会用数据框的列名作为参数名传递给函数,导致函数收到未定义的fname参数,从而抛出"unused argument"错误。
方案1:修改函数参数名匹配列名
直接调整demo_4的参数名,让它和数据框列名一致:
library(purrr) library(rlang) library(tibble) # 你的参数数据框(已将.args分隔符改为分号) arguments <- tibble( fname = c(rep("rnorm",5), rep("runif",5), rep("rexp",5)), .args = c( "n=10;mean=0;sd=3", "n=100;mean=0;sd=3", "n=1000;mean=0;sd=3", "n=10000;mean=0;sd=3", "n=100000;mean=0;sd=3", "n=10;min=0;max=10", "n=100;min=0;max=10", "n=1000;min=0;max=10", "n=10000;min=0;max=10", "n=100000;min=0;max=10", "n=10;rate=2", "n=100;rate=2", "n=1000;rate=2", "n=10000;rate=2", "n=100000;rate=2" ) ) # 修正后的函数 demo_4_fixed <- function(fname, .args) { # 用match.fun替代get,更安全地查找函数 func <- match.fun(fname) # 解析参数字符串为表达式列表 args <- parse_exprs(.args) # 调用函数 do.call(func, args) } # 使用pmap逐行处理 results <- pmap(arguments, demo_4_fixed) # 查看第一个结果 results[[1]]
方案2:保留原函数,用显式映射
如果你想保持demo_4的参数名不变,可以用pmap()的公式语法,显式将数据框列映射到函数参数:
# 你的原demo_4函数 demo_4 <- function(.fname, .args){ x <- get(.fname) y <- parse_exprs(.args) do.call(x,y) } # 用公式映射列到参数:.x对应第一列fname,.y对应第二列.args results <- pmap(arguments, ~ demo_4(.x, .y)) # 查看第一个结果 results[[1]]
额外优化:兼容原逗号分隔的.args列
如果你想保留原始.args列的逗号分隔(而非改为分号),可以修改函数内部逻辑,先拆分字符串再解析:
demo_4_compatible <- function(fname, .args) { func <- match.fun(fname) # 拆分逗号分隔的参数,去除空格后逐个解析 args_list <- strsplit(.args, ",")[[1]] %>% trimws() %>% lapply(parse_expr) do.call(func, args_list) }
内容的提问来源于stack exchange,提问作者Charles Knell
相关产品推荐
相关产品推荐

