R Markdown - 可变输出名称

Sos*_*sel 29 markdown r knitr r-markdown

使用一个R markdown文件,我想创建不同的输出pdf文档,其中输出文件名应在文档中定义.有没有办法说服markdown以这种方式操纵输出文件名?理想情况下,我想通过r块传递文件名.

Lou*_*dox 40

Knit通过使用未记录的knit钩子重新定义按钮的功能(默认函数称为rmarkdown::render),您可以保持使用RStudio 按钮的简单性和YAML标头的可重复性.output_filerender函数的参数指定文件名,因此通过设置它会覆盖使用与输入文件名相同的前缀的标准行为.

例如,始终输出名为myfile.pdf的文件

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

该函数可以是匿名的一行以及从封装进口,如图这里slidify.

您可以设置自己的YAML标头(我不知道这通常是否通常建议),可以访问,rmarkdown::metadata$newheader但就我所见,它们似乎无法在此类功能中使用.

至于从R块传递文件名...如果你指的是YAML标题下面的代码块,根据我的经验,我认为不可能(?).标题可以包含内联R命令(单个反引号封装,从开头r),但似乎不适用于此挂钩函数.

相关:


ily*_*lya 23

这几乎就是我做的事情:

rmarkdown::render('my_markdown_report.Rmd',
                  output_file = paste('report.', Sys.Date(), 
                                      '.pdf', sep=''))
Run Code Online (Sandbox Code Playgroud)

我有三个脚本 - 一个拉取数据并处理它,另一个创建图表和表格用于报告.第三个基于markdown文件创建报告.您在上面看到的代码是第三个脚本的一部分


Flo*_*adt 11

我最好的解决方法(到目前为止)

查看堆栈上的完整故事

我在没有完全理解它的工作原理的情况下玩弄了 Knitr-hook,并遇到了一个丑陋的解决方法。下面的编码似乎可以解决问题。如果有人可以解释它为什么起作用和/或它可以写得不那么难看,那就太好了。

现在我失去了闪亮的输入屏幕,但相信这甚至可以在以后添加。好消息是 R-Studio Knit 按钮仍然可以使用。

请注意,副标题和文件名都是:This Works!即使有空格和感叹号。文件保存为This Works!.pdf

通过将文本分配给对象 pSubTitle 来设置文件名和副标题。请注意,参数仍在 YAML 中,但不会产生闪亮的弹出屏幕,因为它们是在 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. ....
Run Code Online (Sandbox Code Playgroud)