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
相关产品推荐
相关产品推荐

