r - Rmarkdown文件成功编织为PDF,但从R调用时出错
问题描述
我编写了一个 Rmarkdown 文件,它加载一些数据并生成一个很酷的 kableExtra 表,其中包含一些符号和自定义颜色和线条,并将其打印为 pdf。
当我打开 Rmarkdown 文件并编织时,它工作得很好,并产生了我想要的确切输出。
我现在想使用一个 R 脚本循环遍历数据的一些不同子集,为每个生成一个新表(和单独的输出 pdf)。所以,我需要从 .R 文件中调用我的 .Rmd 文件。
但是,当我这样做(使用该rmarkdown::render
函数)时,我会得到直接从 .Rmd 文件中编织时不会发生的错误。
下面是一个功能齐全的 .Rmd 文件,它与我在真实数据中使用的文件相似。我从第二个 R 脚本调用它,使用rmarkdown::render("table_creator.Rmd", pdf_document(latex_engine = "xelatex"))
.
我遇到的第一个错误是Error: Functions that produce HTML output found in document targeting latex output.
. 我添加always_allow_html: yes
到 .Rmd 文件的标题并重试。再次直接编织 .Rmd 文件可以正常工作。现在从 .R 脚本调用它会产生错误:
! Undefined control sequence.
l.94 ...oup\fontsize{16}{18}\selectfont \textcolor
[HTML]{ffde71}{$\bullet$}\...
在这一点上,我认为渲染发生的设置与我直接编织 .Rmd 文件时使用的设置不同。几乎就像它没有解析 .Rmd 文件中的完整标头一样,但我不确定。我不知道如何在这一点上进行,并希望得到任何帮助。
---
title: ""
output:
pdf_document:
latex_engine: xelatex
header-includes:
- \usepackage[T1]{fontenc}
- \setmainfont{Helvetica}
- \DeclareTextCommand{\nobreakspace}{TU}{\leavevmode\nobreak\ }
---
```{r, echo=FALSE, message = FALSE, warning = FALSE}
# Packages
suppressMessages(library(kableExtra))
suppressMessages(library(dplyr))
table_info <- data.frame(Symbol = c("$\\bullet$", "$\\blacksquare$",
"$\\blacklozenge$", "x", "+", "$\\bullet$"),
Name = letters[1:6],
Results = sample(c("good", "bad"), 6, replace = TRUE),
FontSize = c(16, 10, 11, 16, 16, 18),
Color = c("#ffde71", "#0c0000", "#0c0000", "#0c0000",
"#0c0000", "#cb6f86"))
ktable <- table_info %>%
mutate(Symbol = cell_spec(Symbol, color = Color,
font_size = FontSize,
escape = FALSE,
format = "latex")) %>%
select(-Color, -FontSize) %>%
kable(escape = FALSE, align = c("l", "l", "l"),
booktabs = TRUE) %>%
row_spec(1:5, hline_after = TRUE) %>%
row_spec(1:6, color = "gray") %>%
column_spec(1, "1.5em")
```
```{r, echo=FALSE}
ktable
```
编辑: sessionInfo() 的附加上下文信息 输出:
sessionInfo() R 版本 3.4.3 (2017-11-30) 平台:x86_64-apple-darwin17.3.0 (64-bit) 运行于:macOS High Sierra 10.13.1
矩阵产品:默认 BLAS:/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib LAPACK:/System/Library/Frameworks/Accelerate.framework/Versions/A /Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib
语言环境:[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
附加的基础包:[1] stats graphics grDevices utils datasets methods base
其他附加软件包:[1] bindrcpp_0.2 dplyr_0.7.4 kableExtra_0.9.0 rmarkdown_1.9
通过命名空间加载(未附加):[1] Rcpp_0.12.15 rstudioapi_0.7 bindr_0.1 knitr_1.20 xml2_1.2.0
[6] magrittr_1.5 hms_0.4.2 rvest_0.3.2 munsell_0.4.3 viridisLite_0.3.0 [11] colorspace_1 .3-2 R6_2.2.2 rlang_0.1.6 plyr_1.8.4 stringr_1.2.0
[16] httr_1.3.1 tools_3.4.3 htmltools_0.3.6 yaml_2.1.18 assertthat_0.2.0 [21] rprojroot_1.3-2 digest_0.6.15 tibble_1.4.2 readr_1。 1.1 胶水_1.2.0
[26] evaluate_0.10.1 stringi_1.1.6 compiler_3.4.3pillar_1.1.0 scales_0.5.0
[31] backports_1.1.2 pkgconfig_2.0.1
解决方案
我要回到这个,因为我也有一个非常相似的问题。问题是我能够手动编织 PDF,但是一旦我通过 R 中的脚本完成它,我就会收到一个Error in xml_children(x)[[search]] : subscript out of bounds
错误。
我能够确定这是源于制作中的row_spec()
所有内容,kable
但是在删除row_spec()
呼叫后,我遇到了一个error: Functions that produce HTML output found in document targeting latex output.
错误。
奇怪的是,这只发生在我项目的特定分支上 - 而不是主分支。但是,切换回主分支并没有解决问题。重新启动 R 确实如此。更复杂的问题是,如果我在主分支中启动 R,然后切换到开发分支,但没有自动重新获取所有内容,则不会出现错误。这表明错误存在于开发分支的新脚本中。
所以我sessionInfo()
调用了通过主分支和开发分支加载 R 的调用,发现在我的一个较新的脚本中,在引入所有其他包(包括已经调用)library(kableExtra)
后,我有一个正在加载的附加脚本。kableExtra
出于某种奇怪的原因,这个额外kableExtra
的调用还引入了virisdisLite
and webshot
,这两个包最初不存在于初始kableExtra
调用中。
一旦library(kableExtra)
删除了额外的,问题就解决了,两个额外的包不再被调用,to pdf 不再有任何virisdisLite
问题。webshot
render()
推荐阅读
- byte-buddy - 使用 Byte Buddy 拦截 Object.class toString() 方法
- python - 将lat lon字符串转换为geojson多边形
- swift - @Published 变量在 API 调用后不会重新加载我的视图?
- node.js - 我无法在 Nodejs (Express) 中将 cookie 的 SameSite 属性设置为 None
- reactjs - reactjs中的条件componentWillUnmount()
- mysql - 哪个顾客吃了哪个食物(正确加入?)
- html - CSS照片网格布局问题
- google-cloud-platform - 使用 bq 命令在 GCP Bigquery 和 Cloud SQL (Mysql 5.7) 之间创建连接时发出错误
- django - 在哪里添加 Tinymce api 密钥?
- java - 如何登录控制器客户端超时Micronaut产生的499