如何使用Rscript命令行工具在bookdown中构建一本书

时间:2018-06-16 14:41:23

标签: r r-markdown bookdown

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

要呈现的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

3 个答案:

答案 0 :(得分:2)

在对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)

然后它有效。

答案 1 :(得分:2)

作为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()一起使用。有关详细信息,请参阅簿记簿中的Section 3.4

答案 2 :(得分:0)

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")'

做你期望的事。由于您通常在rmarkdown::render()中指定输出文件,因此我不确定书籍支持,因为输出文件只有_bookdown.yml