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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:36:09