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

问题描述 投票:0回答:3

考虑这个 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
几乎从不,在什么情况下 will 一个包需要将
:::
用于它自己的对象?


额外

我有一个非常类似的相关问题,我确实需要

:::
作为内部函数,但我不知道为什么需要它。希望这个问题的答案能够解决那个问题。我怀疑解锁环境正在做一些我没有预料到的事情,因此必须在内部函数上使用
:::

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

r r-package
3个回答
5
投票

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


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


0
投票

这是我认为可能需要

:::
的另一个例子:

internal_fun <- function(data, formula) {
  model.matrix(formula, data = data)
}


#' @title Some fancy stuff
#'
#' @description Wowzers
#'
#' @param data \code{data.frame}
#' @param formula A formula involving variables in data
#' @param ... further unused arguments.
#'
#' @returns A model frame including all predictors on the right-hand side of \code{formula}.
#'
#' @export
#'
#' @examples
#' fancy_function(data = mtcars, formula = cyl ~ disp)

fancy_function <- function (data, formula, ...) {
  cl <- match.call()
  mf <- match.call(expand.dots = FALSE)
  m <- match(c("data", "formula"), names(mf), 0L)
  mf <- mf[c(1L, m)]
  mf[[1L]] <- quote(testpackage:::internal_fun)
  mf <- eval(mf, parent.frame())

  return(mf)
}

删除包前缀

testpackage:::
会导致示例失败,因为 R 找不到
internal_fun

用于测试此包代码的 Github 存储库位于:https://github.com/jepusto/testpackage

© www.soinside.com 2019 - 2024. All rights reserved.