bookdown中如何使用Rscript命令行工具建书

How to use Rscript command line tool to build a book in bookdown

由于交叉引用功能,我使用 bookdown 而不是 rmarkdown 来生成动态报告。我有多个报告要生成,所以我起草了一个 R 脚本来在 for 循环中调用 bookdown:render_book 来生成所有报告。不幸的是,它出错了。为简单起见,我构建了一个最小示例:

要渲染的 bookdown 文件(另存为 index.Rmd):

---
title: "test"
output: html_document
---

```{r test}
ext_var
```

build.R:

ext_var <- "test.html"
bookdown::render_book("index.Rmd", output_file = ext_var) # it will call `rmarkdown::render`.

使用以下命令时:Rscript build.R,将生成以下错误消息:

$ Rscript build.R
Error in rmarkdown::render(main, output_format, ..., clean = clean, envir = envir,  :
  'ext_var'
Calls: <Anonymous> -> render_cur_session -> <Anonymous>
Please delete _main.Rmd after you finish debugging the error.

然后我将 build.R 改为使用 rmarkdown::render

ext_var <- "test.html"
rmarkdown::render("index.Rmd", output_file = ext_var)

不会有任何错误。所以我想可能有一些问题需要解决。

sessionInfo():

R version 3.5.0 (2018-04-23)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=Chinese (Simplified)_China.936  LC_CTYPE=Chinese (Simplified)_China.936   
[3] LC_MONETARY=Chinese (Simplified)_China.936 LC_NUMERIC=C                              
[5] LC_TIME=Chinese (Simplified)_China.936    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RevoUtils_11.0.0     RevoUtilsMath_11.0.0

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.17    bookdown_0.7    digest_0.6.15   rprojroot_1.3-2 backports_1.1.2
 [6] magrittr_1.5    evaluate_0.10.1 stringi_1.1.7   rstudioapi_0.7  rmarkdown_1.10 
[11] tools_3.5.0     stringr_1.3.1   xfun_0.1        yaml_2.1.19     compiler_3.5.0 
[16] htmltools_0.3.6 knitr_1.20  

还在 rstudio/bookdown 存储库中提交了 an issue #592

Bookdown 需要不止一个 Rmd 文件,因此错误不在于 Rscript,而在于您的设置。

如果您有适当的簿记设置,例如

edd@rob:~/git/bookdown-demo(master)$ ls  
01-intro.Rmd        05-summary.Rmd       _bookdown.yml  preamble.tex 
02-literature.Rmd   06-references.Rmd    index.Rmd      README.md 
03-method.Rmd       book.bib             LICENSE        style.css  
04-application.Rmd  bookdown-demo.Rproj  _output.yml    toc.css    
edd@rob:~/git/bookdown-demo(master)$  

然后 运行

Rscript -e 'bookdown::render_book("index.Rmd")'

如您所愿。我不确定 bookdown 支持给定输出文件 down rmarkdown::render() 正如您通常在 _bookdown.yml.

中指定的那样

经过对bookdown::render_book函数的仔细研究,我找到了这个错误的真正原因。该函数设置了一个参数clean_envir,默认值为!interactive()。这就是为什么在使用命令行工具使用 bookdown 编织时环境变量消失的原因。解决这个问题很简单,只需将 clean_envir 设置为 FALSE,即

ext_var <- "test.html"
bookdown::render_book("index.Rmd", output_file = ext_var, clean_envir = FALSE)

然后就可以了。

you have discovered by yourself一样,问题是由您的情况中的默认render_book(clean_envir = TRUE)引起的。

但是,还请注意 bookdown::render_book() 不能用于 bookdown 包中以外的输出格式。换句话说,您不应期望 html_document 格式与 render_book 一起使用。如果需要交叉引用功能,请使用bookdown包中名称以2结尾的输出格式(如bookdown::html_document2),这些格式设计用于 rmarkdown::render()。有关详细信息,请参阅 bookdown 书中的 Section 3.4