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

R语言使用purrr映射多个函数到两个输入时报对象未找到错误如何解决

问题原因

你遇到的报错核心是map2不属于dplyr的上下文动词,不支持数据掩蔽,无法直接识别数据框内部的列名true、preds,直接写列名时R会默认在全局环境搜索对应对象,找不到就会抛出「对象未找到」的错误。

解决方案

推荐以下适配后续扩展需求的写法,后续新增指标只需要往funcs列表里追加对应向量级评估函数即可,无需修改下游运算逻辑:

library(yardstick)
library(tidyverse)

# 你的函数列表保持不变,新增指标直接在这里加即可
funcs <- list(
  accuracy = yardstick::accuracy_vec,
  recall = yardstick::recall_vec
)

n <- 1000
x <- as.factor(rbinom(n, 1, 0.5))
y <- as.factor(rbinom(n, 1, 0.5))

df <- tibble(
  true = rep(list(y), 3),
  preds = rep(list(x), 3)
)

# 核心运算逻辑
df_result <- df %>%
  # 开启行级运算上下文,此时可以直接调用列名访问每行的列表元素
  rowwise() %>%
  mutate(
    # 对当前行的true、preds运行所有评估函数,返回命名数值向量
    metrics = list(map_dbl(funcs, ~.x(truth = true, estimate = preds)))
  ) %>%
  # 把metrics列的命名向量展开为独立列
  unnest_wider(metrics)

运行后df_result的结构完全符合你预期的输出格式。

如果偏好纯purrr写法,也可以用以下代码实现同样效果:

df_result <- df %>%
  bind_cols(
    map2_df(
      .x = .$true, .y = .$preds,
      \(x, y) map_dbl(funcs, ~.x(truth = x, estimate = y))
    )
  )

这里的.$是主动从管道传入的数据框中提取对应列,避免全局搜索对象。

内容的提问来源于stack exchange,提问作者Oska Fentem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:30:02