使用包中的单个功能

时间:2019-01-20 16:05:01

标签: r namespaces package

使用已卸载软件包中的各个功能

随着时间的流逝,我发现自己在R会话开始时正在加载越来越多的软件包。仅加载tidyverse会加载比以前更多的软件包。因此,我发现自己越来越有可能受到函数名称冲突的打击。尤其是当我在程序包加载过程中没有注意到那些冲突时,它们可能会造成令人困惑的结果和奇怪的错误。因此,我想知道我是否可以总体上仅导入要使用的特定功能,而无需加载其附带的软件包。

更确切地说,如果this_pack是在本地安装但未加载的软件包,并且this_fn()是this_pack中的导出函数,我可以放心地期望this_pack::this_fn()可以正常工作,并且可以是否以与加载整个程序包相同的方式工作?我知道通常会这样,但是我想知道是否有时候我会期望它失败。

请参阅相关问题的答案以获取更多信息:

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

1 个答案:

答案 0 :(得分:3)

是的,如今应该可以安全地致电this_pack::this_fn()。如果未加载this_pack,则将加载它(全部)。 (请记住,加载和附加程序包是不同的!加载它会将其存储在内存中,而不是在搜索列表中。附加它会将其放在搜索列表中。)这可能会使第一个调用有点慢,但该程序包会保留下来已加载,因此后续调用会更快。过去,每次调用评估::都需要花费大量时间,但我认为即时编译已基本消除了这种情况。但是,如果需要,您可以使用

获得本地副本。
local_copy <- this_pack::this_fn

,然后调用local_copy(),而无需再次支付::查找。

由于所有程序包都有名称空间,因此,除非程序包的作者真的努力颠覆正常机制,否则this_pack::this_fn()(或local_copy())进行的任何调用都将到达正确的位置。

如果您自己编写一个程序包,则可以仅导入该功能。这意味着加载您的软件包将触发this_pack的加载:因此您的加载会慢一些,但是第一次调用this_fn()会更快。