Глобальные внутренние каталоги в пакете R? - PullRequest
0 голосов
/ 08 июля 2019

Каков наилучший практический подход для включения глобальных, внутренних путей к каталогам (или чего-то подобного) в пакет 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. Но я не очень понимаю, что здесь происходит. Так что я с подозрением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...