【问题标题】:Using {knitr} spin function ignores chunk options使用 {knitr} spin 函数忽略块选项
【发布时间】:2019-05-11 15:23:53
【问题描述】:

我在将 spin-annotated 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 &lt;- 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)。

【问题讨论】:

    标签: r r-markdown knitr


    【解决方案1】:

    区别在于.3 &lt;- .5在语法上是正确的,但for &lt;- 5不是。

    其中的第一个会产生运行时错误。通常,赋值的左侧可以是表达式,这就是解析 x[1] &lt;- 3 之类的内容的方式。只是在评估时并非所有表达式都被允许。

    for &lt;- 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
    ```
    

    【讨论】:

    • 啊,对不起。行号是原始文件的剩余部分。我已将其缩减为仅包含问题中的代码,但复制了较旧的错误消息。在上面的代码上运行render 命令会给出相同的错误,但行号正确。但我想 {knitr} 中可能发生了一些变化。猜猜我必须对文件的这一部分进行硬编码。如果有人没有给出有效的解决方案,我会接受你的回答。
    • 确实给了你一个可行的解决方案:使用.Rmd,而不是.R
    • 是的,问题是 - 有一个来自同一个 jupyter notebook 的相互连接的文件系统,与重新排列整个系统来解决这个问题相比,硬编码该部分的工作量要少得多一条错误消息。所以切换到.Rmd 不是我当时考虑做的事情。但你是对的,这一个可能的解决方案。
    • 你不能source()那个文件。它做了knitr 所做的事情:解析整个事物,然后进行评估。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多