典型情况如下:
library(dplyr)
library(xgboost)
Run Code Online (Sandbox Code Playgroud)
当我导入库xgboost,函数slice的dplyr被掩盖的,我不得不写dplyr::slice,即使我从来没有使用xgboost::slice明确.
这个问题的明显的解决方案是导入xgboost之前dplyr.但是导入所有可能影响dplyr事先功能的库是很疯狂的.此外,当我使用caret库时,这个问题经常发生.即train函数自动导入所需的库,并且当时屏蔽了一些函数.
xgboost::slice使用早期导入的函数(例如dplyr::slice)屏蔽"屏蔽功能" (例如)?笔记
Dir*_*tel 19
R的下一个版本在NEWS {.Rd}文件中引用(引自NEWS构建后的文件):
• The import() namespace directive now accepts an argument except
which names symbols to exclude from the imports. The except
expression should evaluate to a character vector (after
substituting symbols for strings). See Writing R Extensions.
Run Code Online (Sandbox Code Playgroud)
手册中引用的文本在这里(原始texi格式).
我们很快就能做到.眼下缺一不可,那就是屁股一个巨大的痛苦特别是当从基础R软件包的功能被屏蔽:lag(),filter(),...
我们过去曾使用反社会这一术语来表达这种行为.我认为它不太强大.
为了说明这个问题,这里是我十年前写的代码片段(并将其发布在现已消失的R Graph Gallery上),它使用一种聪明而快速的方法来计算移动平均值:
## create a (normalised, but that's just candy) weight vector
weights <- rep(1/ndays, ndays)
## and apply it as a one-sided moving average calculations, see help(filter)
bbmiddle <- as.vector(filter(dat$Close, weights,
method="convolution", side=1))
Run Code Online (Sandbox Code Playgroud)
如果你library(dplyr)在互动环节中尽可能地做到了,那么你已经死在了水中,就像filter()现在完全不同的东西一样.不太好.
ktu*_*tur 14
现在,您还可以使用包conflict_prefer()中的函数conflicted来指定哪个包的函数应该“获胜”,以及当存在冲突的函数名称时应该屏蔽哪个函数(详细信息请参见此处)。在你的例子中,你会运行
conflict_prefer("slice", "dplyr", "xgboost")
Run Code Online (Sandbox Code Playgroud)
加载库后立即进行。然后当你运行时slice,它会默认使用 usingdplyr::slice而不是xgboost::slice. 或者你可以简单地运行
conflict_prefer("slice", "dplyr")
Run Code Online (Sandbox Code Playgroud)
如果您想dplyr::slice优先于所有其他包的slice功能。
Das*_*son 13
- 可以防止某些功能被屏蔽?
我不相信,但我可能是错的.我不确定这会是什么样子
- 是否可以使用早期导入的函数(例如dplyr :: slice)屏蔽"掩蔽函数"(例如xgboost :: slice)?
如果您只是询问或在交互式会话中使用,您可以随时定义slice为您实际想要使用的功能
slice <- dplyr::slice
Run Code Online (Sandbox Code Playgroud)
然后你就可以使用slice它就好像它是dplyr版本(因为它现在是).
解决方案是管理您的命名空间,就像在其他语言中一样.您可以有选择地导入dplyr函数:
select <- dplyr::select
Run Code Online (Sandbox Code Playgroud)
为方便起见,您还可以导入整个包,并从以前连接的包中有选择地重新导入函数:
library("dplyr")
filter <- stats::filter
Run Code Online (Sandbox Code Playgroud)
R有一个很棒的模块系统,附加整个命名空间对于交互式使用尤其方便.如果包裹作者的偏好与您的偏好不匹配,则需要进行一些手动调整.
请注意,在包和长期维护脚本中,您应该为选择性导入授予特权,部分原因是在将来的版本中很难预测新的导出函数.批量导入多个软件包可能会随着时间的推移而出现意外屏蔽.
更一般地说,一个好的规则是依靠单个附加包并选择性地导入其余包.为此,tidyverse如果你是一个沉重的tidyverse用户,那么这个包可能会很方便,因为它为几个包提供了一个导入点.
最后,从你的问题看来,你认为附加包的顺序可能在其他包中有副作用.这没什么好担心的,因为所有包都有自己的上下文.导入方案只会影响您的脚本.