首页 > 解决方案 > 使用包中的单个函数

问题描述

使用卸载包中的单个函数

随着时间的流逝,我发现自己在 R 会话开始时加载了越来越多的包。只是加载 tidyverse 加载的包比我以前的标准要多。正因为如此,我发现自己越来越容易受到函数名冲突的影响。特别是当我在包加载过程中没有注意到这些冲突时,这些可能会产生令人困惑的结果和奇怪的错误。所以我想知道我是否可以,一般来说,只导入我想使用的特定功能,而不加载它来自的包。

更准确地说,如果this_pack是本地安装但未加载的包,并且this_fn()是 this_pack 中的导出函数,我是否可以安全地期望this_pack::this_fn()它能够正常工作,并且以与加载整个包时相同的方式工作?我知道它通常会这样做,但我想知道是否有时我应该预期它会失败。

有关其他信息,请参阅相关问题的答案:

我已经接受了 user2554330 的回答,我认为这不是对所引用的其他问题的回答。尽管如此,它们仍然提供了有关使用或不使用 :: 的其他原因的有趣且相关的信息,因此我认为保留交叉引用可能是一个好主意。我已经在上面合并了它们。

标签: rnamespacespackage

解决方案


是的,现在打电话应该总是安全的this_pack::this_fn()。如果this_pack没有加载,这将加载它(全部)。(请记住,加载和附加一个包是不同的!加载它会将它放在内存中,但不会放在搜索列表中。附加它会将它放在搜索列表中。)这可能会使第一次调用有点慢,但包会保留加载,因此后续调用会更快。过去的情况是::,每次调用都需要花费大量时间进行评估,但我认为即时编译基本上已经消除了这一点。但如果你愿意,你可以使用

local_copy <- this_pack::this_fn

local_copy()然后在不支付::查找费用的情况下拨打电话。

由于所有包都有名称空间,因此this_pack::this_fn()(or local_copy()) 进行的任何调用都将转到正确的位置,除非包的作者非常努力地破坏正常机制。

如果你自己写一个包,你可以只导入那个函数。这将意味着加载你的包将触发加载this_pack:所以你的加载会有点慢,但第一次调用this_fn()会更快。


推荐阅读