如何处理safely包裹函数的pmap输出、解决无法unnest提取错误的问题
解决方案:提取purrr::safely返回结果中的错误信息
你原有写法无法正确提取错误信息的核心原因有两个:
mutate(error_message=error$message)是将整个error列表列作为一个整体提取message字段,而非逐行提取每个元素的字段值- 运行成功的行对应的
error值为NULL,直接取字段会返回长度为0的结果,无法和表格行数匹配
以下是两种可直接复用的解决方案:
方案1:使用purrr::map逐行处理(兼容性最高)
用map系列函数遍历error列的每个元素,为空时返回NA,否则提取message字段:
library(tidyverse) library(openxlsx) # 原有生成结果的代码保持不变 example_data <- tribble(~input_col, r"(C:\\Users\\Documents\\example data.xlsx)", r"(C:\\does not exist.xlsx)") result <- example_data %>% mutate(function_output = pmap(list(xlsxFile = input_col), safely(read.xlsx))) # 提取错误信息的代码 result %>% unnest_wider(function_output) %>% mutate( error_message = map_chr(error, ~ ifelse(is.null(.x), NA_character_, .x$message)) ) %>% View()
如果需要同时处理正常返回的result列,也可以用相同逻辑写映射函数。
方案2:使用tidyr::hoist直接提取(更简洁)
hoist是tidyr专门用于提取列表列嵌套字段的函数,会自动将空值填充为NA,不需要提前拆分嵌套列:
result %>% hoist(function_output, result = "result", error_message = c("error", "message")) %>% View()
该写法可以一步提取所有需要的字段,代码更简洁。
内容的提问来源于stack exchange,提问作者JS1991
相关产品推荐
相关产品推荐

