什么时候包需要使用:::作为自己的对象

时间:2016-04-25 22:21:03

标签: r r-package

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

hello.R

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

hello_internal.R

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

NAMESPACE

# 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我需要:::作为内部功能,但我不知道为什么需要它。希望有一个答案可以解决这个问题。我怀疑解锁环境正在做一些我没想到的事情,因此不得不在内部函数上使用:::

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

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

# 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循环的主体未定义为包的函数。因此,当在工作进程上执行时,它不会被视为属于程序包的代码,并且无法访问程序包的内部对象。如果有人可以为这个特定案例提出一个优雅的解决方案,我将感到非常高兴。