Включить файл RMD в R-пакет при использовании неэкспортированных функций - PullRequest
0 голосов
/ 08 октября 2019

Я создаю пакет R, одним из результатов которого является отчет в формате HTML. Я хочу использовать Rmd-файл для его создания, который будет установлен внутри пакета.

После этой темы я понял, как использовать inst / rmd / file.Rmd и каквызовите его (system.file("rmd", "report.Rmd", package = "thepackage")).

Функция моего пакета thepackage::run_report(params, dir) должна вызвать файл Rmd, отправить параметры и в конечном итоге экспортировать отчет в указанную директорию.

В самом отчете я хотел бы запустить как экспортированные функции thepackage, так и неэкспортированные функции.

Я упростил код, но он соответствует идее.

  • Экспортированная функция для запуска отчета:
run_report(params, dir = getwd()) {
  input <- system.file("rmd", "report.Rmd", package = "thepackage")

  rmarkdown::render(input = input,
                    params = params,
                    output_file = "report.html",
                    output_dir = dir,
                    clean = TRUE)
}
  • report.Rmd. get_data() также является экспортируемой функцией пакета:
---
title: "Comparison Report"
output: html_document
params:
  data: ""
  impute_func: ""

``` {r setup}
    knitr::opts_chunk$set(echo = FALSE, message = FALSE, warning = FALSE, cache = FALSE)
    data <- params$data
    impute_func <- params$impute_func
``` #

``` {r get_data}
    library(thepackage)
    dataset <- get_data(data)
    dataset_ready <- thepackage:::impute_values(data, impute_func)
``` #

``` {r summary}
    summary(dataset_ready)
``` #

Я хотел бы иметь возможность использовать как экспортированные, так и неэкспортированные функции пакета, без необходимости использовать ::: команда. В целом, я бы хотел, чтобы RMD вел себя как любая другая экспортируемая функция в пакете, которая может использовать неэкспортированные функции из того же пакета.

Если известно, каков наилучший метод для таких случаев?

1 Ответ

0 голосов
/ 08 октября 2019

Рекомендуется использовать только экспортированные функции. Тщательно продумайте свой дизайн, если обнаружите, что вам нужно использовать внутренние функции: не будут ли пользователи вашего пакета также иметь такую ​​же потребность?

Так что стандартного способа сделать то, что вы хотите, не существует, но естьмного возможностей для нестандартных способов. Вероятно, самое простое - иметь блок кода в начале документа, который импортирует все нужные вам внутренние функции, например,

```{r echo = FALSE}
impute_values <- thepackage:::impute_values
```
...