“pkg :: name”的主要用途

时间:2016-04-20 14:03:43

标签: r namespaces

我注意到SO上的一些答案包含pkg::name的使用,其中name通常是一个函数。

这比library(pkg); ... name()require(pkg); ... name()有什么好处? R帮助,(help("::"))说

  

对于包pkg,pkg :: name返回命名空间pkg中导出的变量名的值,...如果在调用之前未加载命名空间,则将加载该命名空间,但该包不会附加到搜索路径。

这是否意味着在没有加载整个包的额外内存丢失的情况下使用该函数(即,它是否等同于import <function> from <package>)在python中?或者它是否只是一种告诉R在可能存在歧义时使用此包中的函数的方法?

我的问题涉及在{Rscript}中直接使用::或直接在控制台中使用,因此不是链接问题的副本,因为该问题中的OP讨论了{{1}中函数的使用在包开发项目期间打包。另一方面,在这篇文章中似乎有答案可以解释我的问题。谢谢你的链接。 (请注意以下关于Meta的讨论:duplicates flag

2 个答案:

答案 0 :(得分:4)

它避免了命名空间冲突,但仍然需要加载pkg。

示例=&gt;我这样做了:

pryr::mem_used()
dplyr::filter(mtcars, cyl==4)
pryr::mem_used()

在一个R实例中:

pryr::mem_used()
library(dplyr)
filter(mtcars, cyl==4)
pryr::mem_used()

在另一个。

在第一次之前/之后的记忆是:27.7 MB / 30.6 MB 第二个之前/之后的记忆是:27.7 MB / 30.7 MB

我没有做过多次测试,也没看到差异是四舍五入还是其他什么,但是IMO没有真正的节省。

答案 1 :(得分:4)

我使用这种表示法有两个主要原因:

  • 消歧:某些软件包提供的功能与基本R或其他软件包的功能相同。因此,加载这些库取代了某些功能。这种效果被称为“掩蔽”。在这种情况下,我认为这是一种更好的编码方式,使用符号package::function(),以澄清使用哪个同名函数 - 即使它是最近加载到命名空间中的函数,它因此,不需要获得所需的输出。如果一个函数被另一个包掩盖,那么它只是 方式来解决它。

    例如,library(raster) 包含(并加载到命名空间中)一个名为stack()的函数,它与R包中的基本stack()函数utils不同。为了仍然使用基础R中的函数stack(),一旦加载了utils::stack()库,就应该使用raster调用它。

  • 访问未导出到命名空间的函数:这种情况不那么频繁且略有不同。某些库foo.pkg包含未使用library(foo.pkg)加载到命名空间的函数。因此,在这种情况下,library(foo.pkg)无助于访问这些功能。

    我定期遇到这种情况的唯一例子是来自cbind.na()包的非常有用的函数qpcR。只能通过指定qpcR:::cbind.na()来访问它。请注意,在这种情况下需要三个冒号。

重新考虑后,我还有第三个理由可以使用这种表示法:代码紧凑性。如果我知道我只需要一个包的一个特定功能,可能只需要在代码中执行一次,而不对该包提供的其余功能感兴趣,那么我发现符号package::function()更可取。这可能不会给R带来任何明显的好处,但我从其他编程语言的一般建议中采用了这种风格,以避免名称空间污染