【问题标题】:When does a package need to use ::: for its own objects包什么时候需要为自己的对象使用 :::
【发布时间】:2016-08-19 12:38:42
【问题描述】:

考虑这个 R 包有两个函数,一个是导出的,另一个是内部的

你好.R

#' @export
hello <- function() {
  internalFunctions:::hello_internal()
}

hello_internal.R

hello_internal <- function(x){
    print("hello world")
}

命名空间

# Generated by roxygen2 (4.1.1): do not edit by hand

export(hello)

选中此选项后 (devtools::check()),它将返回 NOTE

There are ::: calls to the package's namespace in its code. A package
  almost never needs to use ::: for its own objects:
  ‘hello_internal’

问题

鉴于NOTE 表示几乎从不,在什么情况下包需要为自己的对象使用:::


额外

我有一个非常相似的related question,我确实需要::: 作为内部函数,但我不知道为什么需要它。希望对此有一个答案将解决那个问题。我怀疑解锁环境正在做一些我没有预料到的事情,因此不得不在内部函数上使用:::

如果它们被认为是重复的,我将删除另一个。

【问题讨论】:

  • 人们可能会考虑使用::: 来明确(对读者)该函数来自这个包(但它不是需要

标签: r r-package


【解决方案1】:

在一般情况下你永远不需要这个。如果您以不寻常的方式调用父函数(例如,您手动更改了它的环境,或者您从另一个未附加包的进程调用它),您可能需要它。

【讨论】:

  • 嗨哈德利,当然,这不是必需的,但为什么不鼓励检查呢?例如,对于手动调试,在代码中编写 package:::internal 可能会很方便,这样就不必手动加载内部。使用 package:::internal 编码有什么缺点吗?
【解决方案2】:

这是一个伪代码示例,我认为使用 ::: 是唯一可行的解​​决方案:

# R-package with an internal function FInternal() that is called in a foreach loop
FInternal <- function(i) {...}

#' Exported function containing a foreach loop
#' @export
ParallelLoop <- function(is, <other-variables>) {
   foreach(i = is) %dopar% {
      # This fails, because it cannot not locate FInternal, unless it is exported.
      FInternal(i)
      # This works but causes a note:
      PackageName:::FInternal(i)
   }
}

我认为这里的问题是 foreach 循环的主体没有定义为包的函数。因此,当在工作进程上执行时,它不会被视为属于包的代码,并且无法访问包的内部对象。如果有人能为这个特定案例提出一个优雅的解决方案,我会很高兴。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2022-09-28
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 2014-08-01
    • 2012-09-16
    相关资源
    最近更新 更多