R Markdown - имя выходной переменной

С одним файлом уценки R я хотел бы создать различные возможные выходные PDF-документы, где имя выходного файла должно быть определено в документе. Есть ли способ убедить markdown манипулировать выходным именем файла таким образом? В идеале я хотел бы передать имя файла с помощью фрагмента r.

5 ответов

Решение

Вы можете сохранить простоту использования RStudio Knit кнопка и воспроизводимость заголовка YAML с помощью недокументированного knit перехватить, чтобы переопределить, что делает кнопка (вызывается функция по умолчанию rmarkdown::render). output_file Параметр функции render указывает имя файла, поэтому, устанавливая его, вы переопределяете стандартное поведение, используя тот же префикс, что и для входного имени файла.

например, всегда выводить файл с именем myfile.pdf

knit: (function(inputFile, encoding) { rmarkdown::render(inputFile, encoding = encoding, output_file = file.path(dirname(inputFile), 'myfile.pdf')) })

Функция может быть как анонимной, так и импортированной из пакета, как показано здесь с помощью slidify.

Вы можете установить свои собственные заголовки YAML (я не знаю, рекомендуется ли это вообще так или иначе), доступный в rmarkdown::metadata$newheader но, насколько я понимаю, они не доступны изнутри такого рода функций.

Что касается передачи имени файла из фрагмента R... если вы имеете в виду фрагменты кода под заголовком YAML, из моего опыта я не думаю, что это возможно (?). Заголовки могут содержать встроенные R-команды (заключенные в одну обратную косую черту, начиная с r), но, похоже, не для этой функции хука.

Связанные:

Это в значительной степени то, что я делаю:

rmarkdown::render('my_markdown_report.Rmd',
                  output_file = paste('report.', Sys.Date(), 
                                      '.pdf', sep=''))

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

My best Workaround (so far)

see the complete story on stack

I played around with the Knitr-hook without fully understanding how it works and ran into an ugly workaround. The below coding seems to do the trick. Would be nice if somebody can either explain why it works and/or if it can written less ugly.

For now I lost the shiny input screen but believe this can even be added later. The good thing is that the R-Studio Knit button can still be used.

Please note that the subtitle and the file name are both: This Works! even with space and exclamation mark. The file is saved as This Works!.pdf

The filename and subtitle are set by assigning the text to the object pSubTitle. Note that the params are still in the YAML but are not resulting in a shiny popup screen as they are assigned in the Knitr-hook

---
params: 
  sub_title:
    input: text
    label: Sub Title
    value: 'my_Sub_Title_and_File_Name'
title    : "Parameterized_Title_and_output_file"
subtitle : "`r params$sub_title`"
output:
  pdf_document:
    keep_tex: false
knit: (
  function(inputFile, encoding) { 

    pSubTitle <- 'This Works!'

    rmarkdown::render( 
      input       = inputFile, 
      encoding    = encoding, 
      params      = list(sub_title = pSubTitle),      
      output_file = pSubTitle) })
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## R Markdown

This is an R Markdown document. ....

В продолжение того, что написал @ilya, на этой веб-странице есть отличный пример, демонстрирующий то, что они описывают, а именно, как создать несколько воспроизводимых отчетов из одного и того же документа.Rmd:

http://www.reed.edu/data-at-reed/software/R/markdown_multiple_reports.html

Веб-страница использует два сценария, один сценарий R и один сценарий Rmarkdown для создания нескольких отчетов. Я использовал его как шаблон для своей работы и нашел его очень полезным.

Мое текущее решение для этого и подобных вопросов - через 2 сценария:

  1. Script1: файл «xxx.md» с гибким заголовком yaml, похожим на файл Floris Padt. Этот заголовок позволяет создавать гибкие файлы PDF с указанным заголовком, датами и другими функциями, если вы измените параметры. Однако он не может указывать гибкие имена PDF при его рендеринге.
      ---
params: 
    feature_input: "XXXA"
    date: "08/18/2022"
title: "`Test For `r params$feature_input``"
author: "You Name"
date: "`r params$date`"
output: 
  pdf_document:

---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## R Markdown and data process

```
#Get parameter from yaml head
input_para <- params$feature_input
input_para
```

  1. Script2: "YYY.R", которые указывают параметры в файле xxx.md и указывают имена файлов pdf с помощью output_file при рендеринге.
      featureNames <- c("aaa", "bbb", "ccc")
setwd("path to xxx.md")
for (currentFeature in featureNames) {
  rmarkdown::render("xxx.Rmd", 
                    params = list(feature_input = currentFeature,
                                  date = Sys.Date()),
                    output_file=paste0("output/",currentFeature))
}
  1. Вы можете обновить featureNames в файле yyy.R и запустить yyy.R, чтобы максимально гибко использовать файл xxx.md.

Это решение позволяет:

  1. обновить параметры заголовка yaml,
  2. применить обновленные параметры yaml в фрагменте кода .md,
  3. и сохраните свой PDF-файл с конкретными и гибкими именами.
Другие вопросы по тегам