Функция для возврата исходной документации набора данных в пакете

#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
}
  
  1. Как я могу получить доступ к man / df.Rd из моего пакета?
  2. Есть ли более простой способ получить исходный код либо из документации 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. О, спасибо! Проверю ее и обновлю, как только отсортирую.