R语言zeallot包是否可与future包兼容使用?
结论
运算符被遮蔽不代表zeallot无法和future搭配使用,二者完全可以共存,这种遮蔽只是R命名空间搜索优先级导致的正常现象,不属于包兼容性冲突。
问题原因
单独加载zeallot包时,以下代码可以正常运行,完成多变量平行赋值:
library(zeallot) c(v1, v2, v3) %<-% list(10, 20, 30)
如果先加载zeallot、后加载future,后加载的future包会将自身用于异步赋值的%<-%、%->%运算符放在搜索路径更靠前的位置,默认调用时会优先匹配future包的版本,导致zeallot的平行赋值逻辑失效,加载包时出现的提示就是对这个遮蔽情况的说明:
The following objects are masked from ‘package:zeallot’: %->%, %<-%
解决方案
只需要明确指定运算符所属的包命名空间,或者调整加载顺序、给运算符起别名,就可以同时使用两个包的所有功能,不会有冲突:
- 显式加包前缀调用,不受加载顺序影响:需要用zeallot的平行赋值时写
zeallot::%<-%,需要用future的异步赋值时写future::%<-%,示例如下:library(zeallot) library(future) # 调用zeallot的平行赋值 c(v1, v2, v3) %zeallot::<-% list(10, 20, 30) - 自定义运算符别名避免冲突:
# 给两个包的同名运算符分别起别名 `%c<-%` <- zeallot::`%<-%` `%f<-%` <- future::`%<-%` # 后续用别名调用即可,互不干扰 c(a, b) %c<-% list("a", "b") # 平行赋值 plan(multisession) res %f<-% {Sys.sleep(3); sum(1:100)} # 异步计算 - 调整加载顺序:如果日常使用zeallot的平行赋值频率更高,可以先加载future、再加载zeallot,让zeallot的
%<-%处于搜索路径优先位置,默认调用时直接匹配zeallot的版本,需要用future的功能时再加前缀调用即可。
R中不同包存在同名函数/运算符是非常普遍的情况,这种遮蔽机制只是搜索优先级的体现,不是包之间存在兼容性冲突。
内容的提问来源于stack exchange,提问作者ixodid
相关产品推荐
相关产品推荐

