从 R6 class 中访问包范围的变量

Access package-wide variable from within an R6 class

我目前正在 R 中打包一个 API 包装器,发现自己处于一个场景中,我需要从 R6 class 中访问一个包范围的变量(因为它会用于简单的字符串连接)。您可以在下面找到我的 class:

的示例
#' A class that will need a package-wide variable
#'
#' @export
MyClass <- R6::R6Class(
  "MyClass",
  public = list(
    # This var is a concat between a package-wide variable and a str
    base_url = paste0(.base_url, "me/", "endpoint"),
  )
)

.base_url 在我的 zzz.R 文件中声明如下:

.base_url <- "https://api.coolwebsite.com/v1/"

# Assign var to the environment
.onLoad <- function(libname, pkgname) {
  assign('.base_url', .base_url, envir = parent.env(environment()))
}

现在,在构建包时我收到以下错误,我相信在加载包时我没有完全掌握文件评估的顺序。

Loading test
 Error in paste0(.base_url, "me/", "endpoint") : 
  object '.base_url' not found

目前,我发现在 MyClass 之前评估 .base_url 的唯一方法是通过在将要评估的文件中声明 .base_url 来“改变”评估顺序在 zzz.R 之前(例如 constants.R 或任何按字母顺序排在前面的内容)。

如何将所有包范围的变量保存在 zzz 中并避免出现上述错误?

在这里回答我自己的问题,因为没有人想出答案,这可能对面临同样问题的人有所帮助。

显然有两种方法可以在附加包时覆盖文件顺序(更多关于此 here):

1。 @include 氧气标签

列出函数可能依赖于使用 @include roxygen 标记的文件,将在函数被评估之前强制加载这些文件,确保在函数评估时将所有变量放入命名空间。

#' A class that will need a package-wide variable
#'
#' @include zzz.R
#'
#' @export
MyClass <- R6::R6Class(
  # ... All those fancy class methods
)

这将反映在您 DESCRIPTION 文件的 Collat​​e 部分的更改中。

2。编辑 整理 部分 DESCRIPTION 文件

如果不使用 {roxygen}(但您确实应该使用),您可以手动操作并将 zzz.R 放在 Collat​​e 部分的第一个 DESCRIPTION 文件(在 导入 之后)。