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。
由于交叉引用功能,我使用 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。