如何使用参数将输出文件名和子标题基于用户输入

时间:2019-06-16 20:26:15

标签: r yaml r-markdown knitr

什么起作用

我能够根据用户输入使pdf文件的字幕动态化。我还可以使用YAML的字幕字段生成“半动态”文件名 (工作代码如下)

什么不起作用

但是,作为字幕和基于用户输入的输出文件,我不能同时执行这两项操作。

由于rmarkdown :: yaml_front_matter(inputFile)$ title确实起作用,因此我尝试使用rmarkdown :: yaml_front_matter(inputFile)$ subtitle,但是它似乎具有未评估的r代码。

rmarkdown :: yaml_front_matter(inputFile)$ params $ sub_title很远,但这导致了错误。我不知道参数是否已经设置,甚至可以通过此功能访问。

相关问题

代码

---
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) { 
    rmarkdown::render( 
      input       = inputFile, 
      encoding    = encoding, 
      params      = 'ask',
      output_file = file.path(
      paste0(rmarkdown::yaml_front_matter(inputFile)$title, '.pdf'))) })
---

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

## R Markdown

This is an R Markdown document. ....

上面的代码确实有效,因为它引用了静态山药字段标题。
用字幕替换标题会失败,就像使用params $ subtitle

一样

更新:最佳解决方案(到目前为止)

今天,我在完全不了解其工作原理的情况下使用了Knitr钩,并且遇到了一个丑陋的解决方法。下面的编码似乎可以解决问题。 如果有人可以解释它为什么起作用和/或它可以写得不太丑,那将是很好的。

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

请注意,字幕和文件名均为:此功能!,即使带有空格和感叹号也是如此。该文件另存为 This Works!.pdf

通过将文本分配给对象pSubTitle来设置文件名和字幕。 请注意,参数仍在YAML中,但不会在闪亮的弹出屏幕中显示,因为它们是在Knitr-hook中分配的

Results of the ugly workaround

---
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. ....

0 个答案:

没有答案