从 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
文件的 Collate 部分的更改中。
2。编辑 整理 部分 DESCRIPTION
文件
如果不使用 {roxygen}
(但您确实应该使用),您可以手动操作并将 zzz.R
放在 Collate 部分的第一个 DESCRIPTION
文件(在 导入 之后)。
我目前正在 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
文件的 Collate 部分的更改中。
2。编辑 整理 部分 DESCRIPTION
文件
如果不使用 {roxygen}
(但您确实应该使用),您可以手动操作并将 zzz.R
放在 Collate 部分的第一个 DESCRIPTION
文件(在 导入 之后)。