R包中的全局内部目录路径?

时间:2019-07-08 01:57:00

标签: r package global-variables

在R包中包括全局,内部目录路径(或具有这种作用的东西)的最佳实践方法是什么?是否有一个包含这些最佳实践的软件包?还是我考虑用户与程序包交互的方式(请参见下面的示例)完全错误?

关于此主题确实存在一些SO问题。例如thisthis。为什么我认为仍然要问我的问题:

  • 我专门询问的是全局目录路径,而不是一般的全局变量。
  • 链接的答案中有很多矛盾的信息
  • 答案已过时
  • 自这些答案以来,已经发布了一些软件包(例如herefs),这可能会影响最佳做法。

对于上下文,我正在创建我的第一个R包。我称它为pkg。我打算让用户在具有特定结构的工作目录的R会话中使用pkg。假设工作目录在目录./special/中应有一个文件。

假设在我定义的pkg源中

#' @title Read special
#'
#' @param FILENAME a string filename with ext
#'
#' @return dat
#' @export
read_special <- function(FILENAME) {
  filepath <- file.path(SPECIAL_FOLDER_PATH, FILENAME)
  dat <- read.csv(filepath)
}

其中

SPECIAL_FOLDER_PATH = file.path(".", "special")

是(可能)在程序包源中的某处中定义的全局变量(嗯,这是我的问题:在哪里定义?)。

然后用户可以做

library(pkg)
read_special("special_file.csv")

假设用户的工作目录中有一个./special/special_file.csv

我在其他地方看到的答案摘要:

内部数据

R Packages - External Data中,建议可以将它们另存为内部变量。对于pkg,我可以在SPECIAL_FOLDER_PATH的源中定义pkg/R/sysdata.rda并保存到pkg。以整洁的方式,我可以仅提供以下文件来创建所需的文件:

# pkg/R/data-raw/SPECIAL_FOLDER_PATH.R
SPECIAL_FOLDER_PATH <- file.path(".", "special")
usethis::use_data(SPECIAL_FOLDER_PATH, internal = TRUE)

这似乎是一种简单明了的方法。在处理全局目录路径时,也许这是正确的方法?虽然,就全球而言,通常来说,“邪恶”一词泛滥了。

包装环境

The top-voted answer to "Global variables in a packages in R"主张通过环境使用程序包局部变量。就我而言,我将上面的修改为

read_special <- function(FILENAME) {
  filepath <- file.path(pkg_env$SPECIAL_FOLDER_PATH, FILENAME)
  dat <- read.csv(filepath)
}

# pkg/R/data-raw/SPECIAL_FOLDER_PATH.R
pkg_env <- new.env(parent = emptyenv())
assign('SPECIAL_FOLDER_PATH', file.path(".", "special"), pkg_env)
usethis::use_data(pkg_env, internal = TRUE)

但是建议您应该明确定义这些环境...

隐藏变量

答案之一是建议在包环境中使用隐藏变量。就我而言,我将上面的修改为

read_special <- function(FILENAME) {
  filepath <- file.path(.SPECIAL_FOLDER_PATH, FILENAME)
  dat <- read.csv(filepath)
}

.onLoad <- function(libname, pkgname) {
  assign(".SPECIAL_FOLDER_PATH", file.path(".", "/special"), envir = parent.env(environment()))
}

,我将删除pkg/R/data-raw/SPECIAL_FOLDER_PATH.R文件并得到.rda。但是我真的不明白这里发生了什么。所以我很怀疑。

0 个答案:

没有答案