在R包中包括全局,内部目录路径(或具有这种作用的东西)的最佳实践方法是什么?是否有一个包含这些最佳实践的软件包?还是我考虑用户与程序包交互的方式(请参见下面的示例)完全错误?
关于此主题确实存在一些SO问题。例如this和this。为什么我认为仍然要问我的问题:
here
,fs
),这可能会影响最佳做法。对于上下文,我正在创建我的第一个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
。但是我真的不明白这里发生了什么。所以我很怀疑。