Каков наилучший практический подход для включения глобальных, внутренних путей к каталогам (или чего-то подобного) в пакет R? Есть ли пакет, который демонстрирует эти лучшие практики? Или то, как я думаю о взаимодействии пользователя с моим пакетом (см. Пример ниже), совершенно неверно?
Существуют некоторые вопросы SO на эту тему. Например, это и это . Почему я думаю, что все еще уместно задать мой вопрос:
- Я специально спрашиваю о глобальных путях каталогов вместо глобальных в общем.
- В ответах много противоречивой информации
- Ответы датированы
- После этих ответов было выпущено несколько пакетов (например,
here
, fs
), которые могут повлиять на лучшие практики.
Для контекста я создаю свой первый пакет R. Я назову это pkg
. Я намерен для пользователей использовать pkg
в сеансе R с рабочим каталогом, имеющим очень специфическую структуру. Допустим, рабочий каталог должен иметь файл в каталоге ./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 - Внешние данные предлагается сохранить их как внутренние переменные. В случае 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)
Это похоже на такой прямой подход. Может быть, это правильный подход при работе с глобальными путями каталогов ? Хотя, когда речь заходит о глобалах, термин «зло» часто встречается.
Пакетная среда
Ответ с наибольшим количеством голосов на "Глобальные переменные в пакетах в 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
. Но я не очень понимаю, что здесь происходит. Так что я с подозрением.