如何使用library()的exclude参数排除子包函数解决invoke屏蔽问题?
解决
purrr::invoke与sparklyr::invoke的冲突问题 问题原因
library()的exclude参数仅能排除当前包直接导出的对象。tidyverse是元包,本身并不直接导出invoke——这个函数来自purrr包,tidyverse只是自动帮你加载了purrr,所以你尝试的exclude = "invoke"或exclude = "purrr::invoke"都无法生效,因为tidyverse的导出列表里根本没有这个对象。
可行解决方案
1. 全局环境绑定(你的临时办法,可长期使用)
加载完所有包后,直接将sparklyr::invoke绑定到全局环境,覆盖purrr::invoke:
library(tidyverse) library(sparklyr) invoke <- sparklyr::invoke
2. 用conflicts.policy管理优先级
安装并使用conflicts.policy包,预先设置让sparklyr的函数优先:
install.packages("conflicts.policy") library(conflicts.policy) conflicts_prefer(sparklyr::invoke) # 正常加载包 library(tidyverse) library(sparklyr)
这样后续调用invoke时,会自动优先使用sparklyr的版本。
3. 命名空间直接调用(最稳妥,不污染全局环境)
不需要修改全局环境,在需要使用sparklyr的invoke时,始终带命名空间调用:
# 不管全局环境的invoke是谁,直接指定sparklyr版本 sparklyr::invoke(your_spark_object, "method_name", args)
4. 加载tidyverse时排除purrr(不推荐,会丢失tidyverse功能)
如果你的项目完全不需要purrr包,可以在加载tidyverse时排除它:
library(tidyverse, exclude = "purrr") library(sparklyr)
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

