RTVS:无法使用 data.table 编织文档

RTVS: Unable to Knit Document with data.table

我试图在 Visual Studio (RTVS) 2017 (15.7.4) 中获取一个使用 data.table 包的简单 R Markdown 文档,但无济于事。

这是一个最小可重现的 .rmd 文件(打开了一些可选的调试选项):

---
title: "Untitled"
output: html_document
---

```{r knitr-setup, include = FALSE}
library(knitr)

knitr::opts_chunk$set(eval = TRUE)
opts_knit$set(progress = FALSE, verbose = TRUE)

```

```{r test_id, message=FALSE, results="show", echo=TRUE, warning=FALSE}

require(rmarkdown)
require(data.table, quietly = TRUE, warn.conflicts = FALSE)
options(datatable.verbose = TRUE)


DT = data.table(x=1:3, y=4:6)    # no
DT                               # yes
DT[, z := 7:9]                   # no
print(DT[, z := 10:12])          # yes
if (1 < 2) DT[, a := 1L]         # no
DT                               # yes
```

Some text.

```{r}
sessionInfo()
```

我看过类似的问题,这些问题具有相同的症状:

data.table error when used through knitr, gWidgetsWWW

我已经尝试过命名空间覆盖,类似于我在 "devtools" 包开发中使用它的方式,似乎无关紧要。

https://github.com/rstudio/rmarkdown/issues/278

我认为这可能是我如何引用包(或名称空间等)的问题。但是,完全相同的文件在 "R Studio" 中运行完全正常。所以我不确定是不是这样。

我得到的错误是:

R 评估失败:

rtvs::rmarkdown_publish(blob_id = 29, output_format = "html_document", encoding = 'cp1252')

Error in ':='(z, 7:9): Check that is.data.table(DT) == TRUE. Otherwiese, := and ':=' are defined for us in j, once only and in particular ways. See help(":=").

同样,同一个文档在 R Studio.

中完全没有问题

我确实注意到两个 shell 调用 pandoc 略有不同:

R Studio 电话:

"C:/PROGRA~2/Pandoc/pandoc" +RTS -K512m -RTS dt_error.utf8.md --to html4 --from markdown+autolink_bare_uris+ascii_identifiers+tex_math_single_backslash+smart --output dt_error.html --email-obfuscation none --self-contained --standalone --section-divs --template "C:\Users\bmore\Documents\R\win-library.5\rmarkdown\rmd\h\default.html" --no-highlight --variable highlightjs=1 --variable "theme:bootstrap" --include-in-header "C:\Users\bmore\AppData\Local\Temp\Rtmp0cb9Vo\rmarkdown-stra0bc15f917ea.html" --mathjax --variable "mathjax-url:https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"

Visual Studio 通话:

"C:/PROGRA~2/Pandoc/pandoc" +RTS -K512m -RTS rmd_8c885bcf5786.utf8.md --to html4 --from markdown+autolink_bare_uris+ascii_identifiers+tex_math_single_backslash+smart --output pandoc8c8870d27b22.html --email-obfuscation none --self-contained --standalone --section-divs --template "C:\Users\bmore\Documents\R\win-library.5\rmarkdown\rmd\h\default.html" --no-highlight --variable highlightjs=1 --variable "theme:bootstrap" --include-in-header "C:\Users\bmore\AppData\Local\Temp\Rtmp429dUm\rmarkdown-str8c886f7837b1.html" --mathjax --variable "mathjax-url:https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"

我也向 Visual Studio Developer community 提交了错误报告,但是,我不完全相信如果不更改 IDE.

就无法解决问题

注意上面的代码在 IDE/Interactive 模式下运行良好,当尝试 'knit' 作为任何输出类型时(html, pdf, doc), 出现错误.

sessionInfo()

R version 3.5.0 (2018-04-23) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 10 x64 (build 17134)

Matrix products: default

locale: 1 LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252 LC_NUMERIC=C
LC_TIME=English_United States.1252

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

other attached packages: 1 rmarkdown_1.10 knitr_1.20
ggplot2_2.2.1 dplyr_0.7.6 data.table_1.11.4

loaded via a namespace (and not attached): 1 Rcpp_0.12.17
bindr_0.1.1 magrittr_1.5 rtvs_1.0.0.0 tidyselect_0.2.4 munsell_0.5.0 colorspace_1.3-2 R6_2.2.2 rlang_0.2.1
stringr_1.3.1 plyr_1.8.4 tools_3.5.0 grid_3.5.0
gtable_0.2.0 [15] htmltools_0.3.6 yaml_2.1.19
rprojroot_1.3-2 lazyeval_0.2.1 assertthat_0.2.0 digest_0.6.15
tibble_1.4.2 bindrcpp_0.2.2 purrr_0.2.5 evaluate_0.10.1 glue_1.2.0 labeling_0.3 stringi_1.1.7 compiler_3.5.0

这已在 data.table_1.11.8 中确认已修复,之后根据 @Hugh Ugh 上面的评论确认。

但是,如果有人出于某种原因在 RTVS 中被迫使用 data.table 的先前版本,解决方法是添加:

assignInNamespace("cedta.pkgEvalsUserCode", c(data.table:::cedta.pkgEvalsUserCode, "rtvs"), "data.table")

在脚本块中,像这样:

```{r additional-libraries, echo=FALSE}

    library(data.table, quietly = TRUE, warn.conflicts = FALSE)

    assignInNamespace("cedta.pkgEvalsUserCode", c(data.table:::cedta.pkgEvalsUserCode, "rtvs"), "data.table")

    }
    ```