#r #r-package
#r #r-package
Вопрос:
Допустим, я разработал пакет. В моем пакете у меня есть набор данных с именем df
, который документирован с использованием roxygen2:
#' Title
#'
#' Description
#'
#' Details
#'
...
...
#' @source La la la.
#' @source Fa fa fa.
...
...
Это, конечно, генерирует man / df.Rd, в котором, помимо прочего, есть раздел source:
...
source{
La la la.
Fa fa fa.
}
...
Теперь я хочу создать простую функцию с этим набором данных, которая возвращает источник df
. Я могу извлечь, обработать и вернуть исходный код из readLines()
, однако я не уверен, как ссылаться на пути к файлам здесь или как я мог бы получить доступ к man / df.Rd!
get_source <- function() {
x <- readLines("path_to/df.Rd")
x <- process(x)
x
}
- Как я могу получить доступ к man / df.Rd из моего пакета?
- Есть ли более простой способ получить исходный код либо из документации roxygen2, либо из сгенерированного файла .Rd?
Ответ №1:
Вы могли бы использовать следующую функцию для получения .Rd
документации :
getsource <- function(fn) {
fn <- rlang::ensym(fn)
utils:::.getHelpFile(help(deparse(fn)))
}
getsource(help)
#> title{Documentation}name{help}alias{help}keyword{documentation}description{
#> code{help} is the primary interface to the help systems.
#> }usage{
#> help(topic, package = NULL, lib.loc = NULL,
#> verbose = getOption("verbose"),
#> try.all.packages = getOption("help.try.all.packages"),
#> help_type = getOption("help_type"))
#> }arguments{
#> item{topic}{usually, a link{name} or character string specifying the
#> topic for which help is sought. A character string (enclosed in
#> explicit single or double quotes) is always taken as naming a topic.
#>
...
Создано 2020-09-04 пакетом reprex (версия 0.3.0)
Это также работает с исходной документацией пользовательских пакетов.
Комментарии:
1. @caldwelist, у вас была возможность протестировать это решение?
Ответ №2:
комментарий пользователя 2554330 побудил меня к дальнейшему изучению возможностей использования доступных функций. через tools::
. Однако, как они отметили, это становится намного сложнее для анализа. Таким образом, я исследовал разные пути, и просто намного проще изменить подход. Определите функцию, которая выводит исходный код, а затем используйте его в документации roxygen2 и моей желаемой функции.
raw_source <- function(ret) {
sources <- c("La la la.", "Fa fa fa.")
sources[match(ret, c("a", "b"))]
}
get_source <- function() {
x <- c(raw_source("a"), raw_source("b"))
x <- process(x)
x
}
#' Title
#'
#' Description
#'
#' Details
#'
...
...
#' @source `r get_source("a")`
#' @source `r get_source("b")`
...
...
Не работает
Наконец-то выяснилось, что system.file()
можно получить доступ к определенным каталогам в пакете, но ранее об этом не было известно.
get_source <- function() {
x_path <- system.file("man/df.Rd")
x <- readLines(x_path)
x <- process(x)
x
}
Как указал пользователь2554330, каталог man не установлен, поэтому вышеуказанное не работает.
Комментарии:
1. Однако, как правило,
man
каталог не установлен, так что это не сработает.Rd
Файлы обрабатываются в двоичной форме. Вы все еще можете ее прочитать, просто это намного сложнее, чем чтениеRd
файла. Смотрите страницу справки?tools::Rd_db
для примера.2. О, спасибо! Проверю ее и обновлю, как только отсортирую.