【问题标题】:The main use(s) of "pkg::name" [duplicate]“pkg::name”的主要用途[重复]
【发布时间】:2016-08-13 06:41:01
【问题描述】:

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

这与library(pkg); ... name()require(pkg); ... name() 相比有什么优势? R 帮助,(help("::")) 说

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

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

我的问题与在 Rscript 中或直接在控制台中使用 :: 有关,因此不是链接问题的重复,因为该问题中的 OP 正在讨论使用 stats4 包中的函数一个包开发项目。另一方面,这篇文章中似乎有一些答案可以阐明我的问题。感谢您的链接。 (注意下面关于 Meta 的讨论:duplicates flag

【问题讨论】:

  • @kristang 我的问题实际上并不是链接问题的重复,因为该问题中的 OP 正在讨论在包开发项目期间使用 stats4 包中的函数。另一方面,这篇文章中似乎有一些答案可以阐明我的问题。感谢您的链接。
  • 使用:: 将消除多个包中具有相同名称的函数的歧义,而通常会使用最近加载的包中的函数。例如,library(pryr); library(data.table)“以下对象被‘package:data.table’屏蔽:地址”。在这种情况下,这并不重要,因为这些包中的每一个提供的address 函数本质上是相同的,但情况并非总是如此。 library(pkg)pkg::fun 之间的任何内存或性能差异很可能是微不足道的。
  • 该主题的相关discussion
  • @nrussell 那么消除歧义是:: 的唯一用途吗?是否有像 python 示例中那样的内存节省组件,或者使用pkg::name 将整个包加载到内存中。感谢您的链接。我去看看。
  • 我从未听说有人使用:: 来最小化 R 的内存占用。原因通常是消除歧义和代码清晰。

标签: r namespaces


【解决方案1】:

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

示例 => 我是这样做的:

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 没有真正的节省。

【讨论】:

    【解决方案2】:

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

    • 消歧:某些包提供的函数与基础 R 或其他包中的函数同名。因此,加载此类库会替换某些功能。这种效果称为“掩蔽”。在这种情况下,我认为使用符号package::function() 是一种更好的编码方式,以澄清使用了哪些同名函数——即使它是最近加载到命名空间中的函数,因此它是不是获得所需输出所必需的。如果一个函数被另一个包屏蔽,这是唯一解决它的方法。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-12-14
      • 2011-09-20
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2013-07-06
      • 1970-01-01
      相关资源
      最近更新 更多