Пакет R - Перенос среды из импортированного пакета - PullRequest
1 голос
/ 03 июля 2019

Предположим, что пакет R ( myPackage ) импортирует пакет R RCircos через файл DESCRIPTION и файл NAMESPACE.

$ cat DESCRIPTION
Package: myPackage
Imports: RCircos (>= 1.2.0)
...

$ cat NAMESPACE
import(RCircos)
...

Одним из преимуществ RCircos является то, что он определяет пользовательскую среду (называемую RCircos.Env ) и считывает / записывает переменные в эту среду из различных его функций. Например, функция RCircos.Initialize.Plot.Parameters читает и записывает в эту среду.

...
RCircosEnvironment <- NULL;
RCircosEnvironment <- get("RCircos.Env", envir = globalenv());
RCircosEnvironment[["RCircos.PlotPar"]] <- plot.param;

(Это своеобразное поведение также распознавалось другими пакетами R; см., Например, строки 247-249 этого пакета).

К сожалению, кажется, что среда RCircos.Env не распознается "из коробки" в myPackage , когда я просто импортирую RCircos через файл DESCRIPTION и файл NAMESPACE.

Так что же можно сделать?

Кажется, есть два варианта сделать среду RCircos.Env доступной для таких функций, как RCircos.Initialize.Plot.Parameters. Однако оба этих параметра заставляют проверку CRAN (R CMD check myPackage --as-cran) выдавать ПРЕДУПРЕЖДЕНИЯ или ПРИМЕЧАНИЕ при обязательной оценке myPackage перед отправкой в ​​CRAN, что препятствует ее принятию в CRAN.

Опция 1 : Я включаю следующую строку непосредственно перед функцией, требующей объекта:

# my code here #
assign("RCircos.Env", RCircos::RCircos.Env, .GlobalEnv)
RCircos.Set.Core.Components(...)
# my code here #

Тем не менее, проверка CRAN выделяет эту строку ПРИМЕЧАНИЕ, тем самым предотвращая принятие myPackage на CRAN.

* checking R code for possible problems ... NOTE
Found the following assignments to the global environment:
File ‘PACViR/R/visualizeWithRCircos.R’:
  assign("RCircos.Env", RCircos::RCircos.Env, .GlobalEnv)

Опция 2 : Я загружаю всю библиотеку RCircos перед функцией, требующей объекта:

# my code here #
library(RCircos)
RCircos.Set.Core.Components(...)
# my code here #

Однако проверка CRAN выделяет эту опцию ПРЕДУПРЕЖДЕНИЕМ, снова предотвращая принятие myPackage на CRAN.

* checking dependencies in R code ... WARNING
'library' or 'require' call not declared from: ‘RCircos’
'library' or 'require' call to ‘RCircos’ in package code.
  Please use :: or requireNamespace() instead.
  See section 'Suggested packages' in the 'Writing R Extensions' manual.

Конечно, должен быть простой и CRAN-совместимый способ сделать среду RCircos.Env доступной для таких функций, как RCircos.Set.Core.Components в myPackage ! Может кто-нибудь назвать и объяснить такой способ?

1 Ответ

1 голос
/ 04 июля 2019

Очевидно, что обычный реэкспорт не работает со средами, как с функциями. Но это работает:

RCircos.Env <- RCircos::RCircos.Env

#' test
#'
#' @param ... data
#'
#' @export
test_fun <- function(...) {
  RCircos::RCircos.Set.Core.Components(...)
}

С DESCRIPTION:

Package: test
Type: Package
Title: test
Description: This is a description.
Version: 0.1.0
Authors@R: person("Wouter", "van der Bijl",
                  email = "redacted@redacted.com",
                  role = c("aut", "cre"))
Maintainer: Wouter van der Bijl <redacted@redacted.com>
License: GPL-3
Encoding: UTF-8
LazyData: true
Imports: RCircos
RoxygenNote: 6.1.1

А это NAMESPACE:

# Generated by roxygen2: do not edit by hand

export(test_fun)

Тест с:

library(test)
data(UCSC.HG19.Human.CytoBandIdeogram, package = 'RCircos')
test_fun(UCSC.HG19.Human.CytoBandIdeogram)

Обычно, когда RCircos запускает get("RCircos.Env", envir = globalenv()), он будет проходить по пути поиска, пока не найдет RCircos.Env из вашего пакета.

При запуске R CMD Check я получаю 0 ошибок, 0 предупреждений, 0 заметок.


Обратите внимание, что эта стратегия, которую использует RCircos, в среде, которая проверяется с помощью get(.., envir = globalenv()), действительно неортодоксальна и, как правило, не очень хорошая идея. Функции R обычно не должны иметь побочных эффектов, таких как редактирование невидимых сред. Установка значений по умолчанию и т. Д. Обычно выполняется с помощью options(). Весь пакет, вероятно, не тот, который вы хотели бы эмулировать, но, по крайней мере, теперь вы можете использовать его как зависимость.

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