получение ленивых данных без прикрепления пакета - PullRequest
0 голосов
/ 30 января 2019

Справочная информация:

У меня есть пакет CRAN R, который зависит от данных с отложенной загрузкой в ​​другом пакете CRAN определенной версии.Мне нужно избегать использования :: для ссылки на данные, потому что это приводит к сбою проверки CRAN.

Я прочитал: Оценка функции в среде пакета без присоединения пакета и Видите, существует ли переменная / функция в пакете?

Я пытался (используя nycflights13 для этого примера):

# this works, but I can't use ::
nycflights13::airlines

find("airlines")
# character(0)
get("airlines", envir = asNamespace("nycflights13"), mode = "list")
#Error in get("airlines", envir = asNamespace("nycflights13"), mode = "list") : object 'airlines' of mode 'list' was not found

# attach
library(nycflights13)

get("airlines", envir = asNamespace("nycflights13"), mode = "list")
# works
find("airlines")
# [1] "package:nycflights13"

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

Что я хотел бы:

CRAN-совместимый способ ссылки на загруженные данныев другом пакете без использования :: или Imports в ОПИСАНИИ.

1 Ответ

0 голосов
/ 05 февраля 2019

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

Другая возможность состоит в том, чтобы использовать тот факт, что :: является командойТаким образом, что-то вроде этого является допустимым R, и с именованием переменных в RHS это позволит гибко запрашивать наличие или отсутствие данных в пространствах имен (а не только в средах на пути search())

`::`(nycflights13, airlines)

:: просто подставляет данные символы для строк и вызывает getExportedValue в base.

Итак, еще лучше, и я думаю, что это мой окончательный ответ:

base::getExportedValue(asNamespace("nycflights13"), "airlines")

Это работает без requireNamespace() или library().

...