我正在编织.Rmd文件,希望每次运行knit时都有两个输出:html和Purl'ed R脚本。可以使用以下Rmd文件完成此操作:

---
title: "Purl MWE"
output: html_document
---

```{r}
## This chunk automatically generates a text .R version of this script when     running within knitr.
input  = knitr::current_input()  # filename of input document
output = paste(tools::file_path_sans_ext(input), 'R', sep = '.')
knitr::purl(input,output,documentation=1,quiet=T)
```

```{r}
x=1
x
```

如果不命名该块,则可以很好地工作,并且每次运行knit()时(或在RStudio中单击knit),都将得到html和.R输出。

但是,如果您命名该块,它将失败。例如:
title: "Purl MWE"
output: html_document
---

```{r}
## This chunk automatically generates a text .R version of this script when     running within knitr.
input  = knitr::current_input()  # filename of input document
output = paste(tools::file_path_sans_ext(input), 'R', sep = '.')
knitr::purl(input,output,documentation=1,quiet=T)
```


```{r test}
x=1
x
```

它失败并显示:
Quitting from lines 7-14 (Purl.Rmd)
Error in parse_block(g[-1], g[1], params.src) : duplicate label 'test'
Calls: <Anonymous> ... process_file -> split_file -> lapply -> FUN -> parse_block
Execution halted

如果注释掉purl()调用,它将与命名的块一起使用。因此,有关purl()调用也如何命名块的问题,即使没有重复,knit()也会认为存在重复的块名称。

有没有办法在.Rmd文件中包含purl()命令,以便产生两个输出(html和R)?还是有更好的方法来做到这一点?我的最终目标是使用新的rmarkdown::render_site()构建一个网站,该网站每次编译时都会更新HTML和R输出。

最佳答案

您可以通过在文件中包含options(knitr.duplicate.label = 'allow')来允许重复标签,如下所示:

title: "Purl MWE"
output: html_document
---

```{r GlobalOptions}
options(knitr.duplicate.label = 'allow')
```


```{r}
## This chunk automatically generates a text .R version of this script when     running within knitr.
input  = knitr::current_input()  # filename of input document
output = paste(tools::file_path_sans_ext(input), 'R', sep = '.')
knitr::purl(input,output,documentation=1,quiet=T)
```


```{r test}
x=1
x
```

该代码未在knitr网站上记录,但您可以直接从Github跟踪最新更改:https://github.com/yihui/knitr/blob/master/NEWS.md

10-06 08:19