如何定位unnest()处理data.frame时触发错误的列?
如何定位
unnest()报错的问题列? 问题场景
有一个包含多列表列的tibble:
df <- tibble::tibble( a = list(c(1,2), c(3,4)), b = list(c(1, 2), 'a') )
尝试用tidyr::unnest(df, everything())一次性展开所有列时,触发类型不兼容错误:
tidyr::unnest(df, everything()) #> Error in `list_unchop()`: #> ! Can't combine `x[[1]]` <double> and `x[[2]]` <character>. #> Backtrace: #> x #> 1. +-tidyr::unnest(df, everything()) #> 2. +-tidyr:::unnest.data.frame(df, everything()) #> 3. | \-tidyr::unchop(...) #> 4. | \-tidyr:::df_unchop(...) #> 5. | \-vctrs::list_unchop(col, ptype = col_ptype) #> 6. \-vctrs (local) `<fn>`() #> 7. \-vctrs::vec_default_ptype2(...) #> 8. +-base::withRestarts(...) #> 9. | \-base (local) withOneRestart(expr, restarts[[1L]]) #> 10. | \-base (local) doWithOneRestart(return(expr), restart) #> 11. \-vctrs::stop_incompatible_type(...) #> 12. \-vctrs:::stop_incompatible(...) #> 13. \-vctrs:::stop_vctrs(...) #> 14. \-rlang::abort(message, class = c(class, "vctrs_error"), ..., call = call)
定位问题列的方法
不用反复移除列测试,可以通过逐个验证列表列的可展开性快速定位:
使用purrr::map遍历每一列,单独尝试unchop(unnest底层依赖的核心函数)并捕获错误:
library(purrr) library(tidyr) library(tibble) map(df, function(col) { tryCatch( unchop(tibble(col), col), error = function(e) e$message ) })
运行后会返回每个列的结果:
- 正常列(如
a)会输出展开后的tibble - 有问题的列(如
b)会返回对应的错误信息,直接定位出引发报错的列。
关于回溯信息的说明
当前的回溯信息没有直接包含问题列的名称。因为错误发生在vctrs::list_unchop处理单个列的阶段,此时上下文已经丢失了原数据框的列名,所以回溯栈里无法直接看到是哪一列导致的错误。
内容的提问来源于stack exchange,提问作者joshbrows
相关产品推荐
相关产品推荐

