R ОПИСАНИЕ file: возможно ли "условно" импортировать пакеты? - PullRequest
1 голос
/ 14 октября 2019

Можно ли включить «условный импорт» в файл DESCRIPTION пакета?

Например, я разрабатываю пакет, который планирует системные задачи. В Windows это достигается с помощью планировщика заданий и пакета taskscheduleR, в Unix - пакета cronR. Таким образом, было бы полезно сделать что-то вроде следующего:

DESCRIPTION

Package: pkgname
Version: 0.0.1

[more fields]

Imports:
    dplyr,
    if (.Platform$OS.type == "windows") "taskscheduleR" else "cronR",
    tidyr

Полагаю, можно было бы написать .onAttach() илиАналогично, который проверяет тип системы и устанавливает соответствующий пакет, если его еще нет, но это не кажется особенно приятным решением - во-первых, он полагается на пользователя, подключающего пакет при подключении к сети доони могут его использовать, а во-вторых, это нарушает формальную цепочку зависимостей.

Мой текущий подход заключается в том, чтобы включить оба пакета в Suggests, а затем ответственность за установку правильного пакета для их системы лежит на пользователе.

1 Ответ

1 голос
/ 14 октября 2019

Я думаю, что это возможно при использовании сценария оболочки configure, как описано в разделе «Написание расширений R». Но у меня нет опыта в этом. Вы также можете делать платформо-зависимые вещи в своих файлах NAMESPACE (здесь это не поможет, но посмотрите пример исходного пакета parallel ).

Вы могли бы помочь своим пользователям, используя это "Подкаталоги R и man могут содержать специфичные для ОС подкаталоги с именем unix или windows." Это позволяет вам иметь специфичный для ОС код, который можетзатем выполните обычную проверку доступности пакета.

Например, в подкаталоге Windows у вас будет что-то вроде:

if (requireNamespace("taskscheduleR", quietly = TRUE)) {
      taskscheduleR::taskscheduler_create(...)
   } else {
      stop("Please install the taskscheduleR package to use this functionality")
   }
...