使用已卸载软件包中的各个功能
随着时间的流逝,我发现自己在R会话开始时正在加载越来越多的软件包。仅加载tidyverse会加载比以前更多的软件包。因此,我发现自己越来越有可能受到函数名称冲突的打击。尤其是当我在程序包加载过程中没有注意到那些冲突时,它们可能会造成令人困惑的结果和奇怪的错误。因此,我想知道我是否可以总体上仅导入要使用的特定功能,而无需加载其附带的软件包。
更确切地说,如果this_pack
是在本地安装但未加载的软件包,并且this_fn()
是this_pack中的导出函数,我可以放心地期望this_pack::this_fn()
可以正常工作,并且可以是否以与加载整个程序包相同的方式工作?我知道通常会这样,但是我想知道是否有时候我会期望它失败。
请参阅相关问题的答案以获取更多信息:
我已经接受了user2554330的答案,我认为这不是对所引用的其他问题的答案。尽管如此,它们还是提供了有关是否使用::的其他原因的有趣且相关的信息,因此我认为保留交叉引用可能是一个好主意。我已经在上面合并了它们。
答案 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()
会更快。