使用furrr::future_map_chr结合dplyr::cur_column()报错的解决方法
解决furrr::future_map_chr结合dplyr::cur_column()的报错问题
问题重现
先看正常运行的基础代码:
library(dplyr) library(purrr) df <- tibble(a = 1:3, b = 4:6) # 正常执行:用purrr::map_chr结合cur_column() df %>% mutate(across(c(a, b), ~ map_chr(.x, ~ paste("列", cur_column(), "的值是", .x))))
改用furrr多进程时触发报错:
library(furrr) plan(multisession) # 触发错误:cur_column() must be used within `across()` df %>% mutate(across(c(a, b), ~ future_map_chr(.x, ~ paste("列", cur_column(), "的值是", .x))))
报错原因
furrr的多进程机制会创建独立的子R会话执行任务,cur_column()依赖的dplyr across()上下文无法传递到子进程中,导致子进程无法识别当前处理的列名,从而抛出错误。
解决方案
方案1:手动传递列名(替代cur_column())
利用across()的函数参数特性:当给across()传递的函数接受两个参数时,第一个参数是列值,第二个参数就是当前列的名称。直接用这个列名参数传递给future_map_chr即可:
df %>% mutate(across(c(a, b), ~ future_map_chr(.x, ~ paste("列", .y, "的值是", .x)), .names = "{col}"))
或者用命名函数的写法更清晰:
df %>% mutate(across(c(a, b), function(col_vals, col_name) { future_map_chr(col_vals, ~ paste("列", col_name, "的值是", .x)) }, .names = "{col}"))
方案2:提前捕获cur_column()的值
在across()的上下文里先捕获当前列名,存储到变量中,再传递给future_map_chr(变量会被序列化到子进程):
df %>% mutate(across(c(a, b), { current_col <- cur_column() ~ future_map_chr(.x, ~ paste("列", current_col, "的值是", .x)) }, .names = "{col}"))
验证结果
两种方案都能正常生成预期结果,且不会触发cur_column()的报错,同时利用furrr实现多进程异步执行。
内容的提问来源于stack exchange,提问作者Josh Persi
相关产品推荐
相关产品推荐

