Apache Arrow R包结合dplyr verbs报错求助:`...`必须为空
解决Apache Arrow与dplyr配合使用时的
... must be empty报错 问题重现
执行以下dplyr+Arrow代码时触发报错:
arrow_table(starwars) %>% filter(species == "Human") %>% mutate(height_ft = height/30.48) %>% select(name, height_ft) %>% collect()
报错信息:
<error/rlib_error_dots_nonempty> Error in `eval_select()`: ! `...` must be empty. x Problematic argument: * error_call = error_call --- Backtrace: x 1. +-... %>% collect() 2. +-dplyr::collect(.) 3. +-dplyr::select(., name, height_ft) 4. +-dplyr::mutate(., height_ft = height/30.48) 5. +-dplyr::filter(., species == "Human") 6. \-arrow:::filter.ArrowTabular(., species == "Human") 7. \-arrow::compute_by(...) 8. \-arrow:::eval_select_by(by, data, error_call = error_call) 9. \-tidyselect::eval_select(expr = by, data = sim_df, allow_rename = FALSE, error_call = error_call) 10. \-ellipsis::check_dots_empty() 11. \-rlang:::action_dots(...) 12. +-base (local) try_dots(...) 13. \-rlang (local) action(...)
会话信息:
> sessionInfo() R version 4.1.0 (2021-05-18) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 10 x64 (build 19045) Matrix products: default locale: [1] LC_COLLATE=English_United States.1252 [2] LC_CTYPE=English_United States.1252 [3] LC_MONETARY=English_United States.1252 [4] LC_NUMERIC=C [5] LC_TIME=English_United States.1252 attached base packages: [1] stats graphics grDevices utils datasets methods [7] base other attached packages: [1] arrow_13.0.0.1 dplyr_1.0.10 loaded via a namespace (and not attached): [1] fansi_0.5.0 tzdb_0.1.2 assertthat_0.2.1 [4] utf8_1.2.2 crayon_1.4.1 R6_2.5.1 [7] DBI_1.1.1 lifecycle_1.0.3 magrittr_2.0.1 [10] pillar_1.6.2 rlang_1.0.6 cli_3.6.0 [13] rstudioapi_0.13 vctrs_0.5.2 generics_0.1.0 [16] ellipsis_0.3.2 tools_4.1.0 bit64_4.0.5 [19] glue_1.6.2 bit_4.0.4 purrr_1.0.1 [22] compiler_4.1.0 pkgconfig_2.0.3 tidyselect_1.1.1 [25] tibble_3.1.3
报错原因
核心是版本兼容性问题:
- 你使用的
arrow_13.0.0.1属于较新版本,它对dplyr、tidyselect等依赖包的版本要求更高。 - 从回溯信息可以看到,arrow调用
tidyselect::eval_select时传递了error_call参数,但你当前安装的tidyselect_1.1.1不支持该参数,触发了ellipsis::check_dots_empty()的报错,提示多余的参数必须为空。
解决方法
方法1:升级dplyr及相关依赖包
arrow 13.x版本要求dplyr最低版本为1.1.0,而你当前使用的是dplyr_1.0.10,直接升级dplyr即可自动兼容依赖:
install.packages("dplyr")
升级完成后重启R会话,再运行原代码即可正常执行。
方法2:降级Arrow到兼容版本
如果无法升级dplyr,可以将Arrow降级到适配dplyr_1.0.10的版本(比如Arrow 10.x系列):
install.packages("arrow", version = "10.0.1")
注意:降级会丢失Arrow新版本的功能,优先推荐方法1。
验证
完成版本调整后,运行以下代码测试:
library(arrow) library(dplyr) arrow_table(starwars) %>% filter(species == "Human") %>% mutate(height_ft = height/30.48) %>% select(name, height_ft) %>% collect()
此时应该能正常返回筛选转换后的结果,无报错。
内容的提问来源于stack exchange,提问作者Harshal Khanolkar
相关产品推荐
相关产品推荐

