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 GitHub - формат вывода
output_file
- Сообщение в блоге, которое я написал после этого вопроса о более сложном использовании
knit:
Hook / соответствующие заметки GitHub вики
Это в значительной степени то, что я делаю:
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 сценария:
- 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
```
- 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))
}
- Вы можете обновить featureNames в файле yyy.R и запустить yyy.R, чтобы максимально гибко использовать файл xxx.md.
Это решение позволяет:
- обновить параметры заголовка yaml,
- применить обновленные параметры yaml в фрагменте кода .md,
- и сохраните свой PDF-файл с конкретными и гибкими именами.