Проблема: я хочу экспортировать список функций как часть пакета R, в идеале с помощью roxygen2.
Точнее, я хочу экспортировать функции в списке, а не сам список. Например, рассмотрим список функций, которые генерируются как замыкания, например:
addval <- 1:100
fns <- lapply(addval, function(y) {force(y); function(x) x + y})
names(fns) <- paste0("add_", addval)
Тогда проблема состоит в том, чтобы привязать функции (используя те же имена в fns
, например) к среде пакета, а затем включить их среди экспортируемых функций пакета.
Привязать функции к среде пакета можно достаточно легко; один из способов был бы
for (nm in names(fns)) assign(nm, fns[[nm]])
Но можно ли использовать теги roxygen2 для экспорта функций add_1
, add_2
и т. д.?
Более конкретно: я бы хотел, чтобы roxygen2 продолжал управлять файлом NAMESPACE
вместо меня, и предпочел бы не писать вызовы export()
напрямую. Единственный способ, которым я могу это сделать, — это написать код для создания шаблона, например
#' @export add_1
NULL
#' @export add_2
NULL
# ...
или лучше
#' @export
add_1 <- fns[["add_1"]]
#' @export
add_2 <- fns[["add_2"]]
# ...
(и отказаться от вышеуказанного цикла for).
Есть ли у roxygen2 средства, эквивалентные созданию такого стандартного шаблона, или мне придется предоставлять эти средства самостоятельно?
Я имею в виду такую возможность, выражающуюся более кратко, как
#' @exportObjects names(fns)
NULL
где тег @exportObjects
будет интерпретировать свой «аргумент» как вектор символов имен объектов для экспорта.
Обновлять
roxygen2 6.0.1+ решает эту проблему с помощью нового тега @evalNamespace
, который позволяет вам вставлять литеральные записи в файл NAMESPACE:
ns_export <- function(nms)
sprintf("export(%s)", paste(nms, collapse = ","))
#' @evalNamespace ns_export(names(fns))
Использование тега @evalNamespace
безопаснее, чем использование директивы exportPattern()
, потому что при использовании последней нужно быть бдительным, чтобы случайно не назвать объект в пространстве имен пакета, который соответствует регулярному выражению.
scales
, то увидите, что в нем много замыканий, и все они задокументированы вручную. - person hrbrmstr   schedule 07.10.2016scales
? Я пересмотрел вопрос, чтобы сделать его более точным и указать, какую неуклюжесть (и дополнительную работу) я хотел бы избежать. - person egnha   schedule 08.10.2016scales
исходный файл с замыканиями. Я не думаю, что вы сможете обойти ручное включение в roxygen2. - person hrbrmstr   schedule 08.10.2016