【问题标题】:Rmarkdown file knits to PDF successfully, but error when called from RRmarkdown文件成功编织为PDF,但从R调用时出错
【发布时间】:2018-06-12 18:19:39
【问题描述】:

我编写了一个 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() 的输出:

会话信息() R 版本 3.4.3 (2017-11-30) 平台:x86_64-apple-darwin17.3.0(64位) 运行于: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 glue_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

【问题讨论】:

  • 您可以在尝试从 R 转换文件后发布sessionInfo() 吗?你能通过为这两种情况生成的pandoc 命令行吗?我也遇到了失败,但出现了不同的错误消息。
  • 谢谢拉尔夫。我在上面添加了 sessionInfo()。我不太确定如何获得中间的pandoc 行?
  • 我收到了几条消息,包括几个控制序列消息,当我向header-includes 添加一些usepackage 行时,这些消息就消失了。我最终在 Rmd 渲染之前添加了 \usepackage{array} \usepackage{booktabs}\usepackage{xcolor}
  • 添加软件包修复了它。非常感谢。如果将来我再次遇到这种情况,我会知道检查更多丢失的包声明。感谢您的帮助!
  • 作为I just said to another user the other day,我强烈建议您将header-includes 的内容放在一个外部文件中,并通过pdf_documentincludes: in_header 选项包含它。 YAML 中的header-includes 字段可能很脆弱,因此您最好尽可能避免使用它。

标签: r latex r-markdown knitr kable


【解决方案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 调用还引入了virisdisLitewebshot,这两个包最初没有出现在最初的kableExtra 调用中。

删除多余的library(kableExtra) 后,问题就解决了,另外两个包virisdisLitewebshot 不再被调用,render() 到pdf 也不再有任何问题。

【讨论】:

  • 感谢您添加此信息和解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-07-07
  • 2023-04-07
  • 2019-03-11
  • 2021-02-11
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 2016-01-15
相关资源
最近更新 更多