使用{knitr}旋转函数将忽略块选项

时间:2019-05-11 15:23:53

标签: r r-markdown knitr

我无法将带有spin注释的R脚本编译为HTML / PDF。

这是MWE:

#' ---
#' output:
#'     html_document:
#'         toc: true
#'         toc_float: true
#'     pdf_document:
#'         toc: true
#' jupyter:
#'   jupytext:
#'     text_representation:
#'       extension: .R
#'       format_name: spin
#'       format_version: '1.0'
#'       jupytext_version: 0.8.4
#'   kernelspec:
#'     display_name: R
#'     language: R
#'     name: ir
#'   language_info:
#'     codemirror_mode: r
#'     file_extension: .r
#'     mimetype: text/x-r-source
#'     name: R
#'     pygments_lexer: r
#'     version: 3.6.0
#' ---
#+ setup, include=F, echo=F
knitr::opts_chunk$set(collapse=T)

#+ error=T
.3 <- 5

#' some text

#+ error=T
for <- 5

该脚本是从运行R内核的Jupyter Notebook创建的。转换是使用jupytext完成的。

构建因以下错误而失败:

Error in parse(text = x, keep.source = TRUE) : 
  <text>:122:5: unexpected assignment
121: #+ error=T
122: for <-
         ^
Calls: <Anonymous> -> <Anonymous> -> getParseData -> parse
Execution halted

这是R车间的摘录,代表错误的变量命名,因此可能会出现错误。因此,error=T块选项。

最让我感到困惑的是(i)该脚本较早编译就没有问题(上一次成功构建是在2018年12月5日;到目前为止尚未尝试重建),并且(ii).3 <- 5是同样错误,但R仅抱怨第二行。

我正在使用以下方法将文档编译为HTML

 Rscript -e 'rmarkdown::render("filename.R", output_format = "html_document")'

在R v3.6和4.14.113-1-MANJARO Linux上运行,knitr是v1.22,rmarkdown是v1.12(根据sessionInfo)。

1 个答案:

答案 0 :(得分:0)

区别在于.3 <- .5在语法上是正确的,而for <- 5不是。

其中第一个会生成运行时错误。通常,分配的左侧可以是表达式,这就是解析x[1] <- 3之类的方式的过程。只是并非在评估时允许所有表达式。

for <- 5行不可解析(因为for是保留字),因此在解析时会发生错误。如您所见,通常会通过诸如“意外...”之类的消息来指示语法错误:

Error in parse(text = x, keep.source = TRUE) : 
  <text>:122:5: unexpected assignment
121: #+ error=T
122: for <-
         ^

如果您注意到行号,则这是要解析的文本的第122行。也许在knitr的早期版本中,解析是逐块完成的,但是现在在评估任何部分之前就已经解析了整个文件:并且该行将不被解析。

如果您将整个内容写为Rmd文件,则会得到以前的行为,因为在其中 的这些块一次被解析:

---
output:
    html_document:
        toc: true
        toc_float: true
---
```{r setup, include=F, echo=F}
knitr::opts_chunk$set(collapse=T)
```

```{r error=T}
.3 <- 5
```

some text

```{r error=T}
for <- 5
```

enter image description here