save_kable() 在 R 中不编译 LaTeX table

save_kable() in R does not compile LaTeX table

我正在研究 R 中的一个便利函数,它可以从一些常见的模型对象打印出具有出版质量的 LaTeX table。这一切在我的 Mac 上都非常适合我,但我主要是为一位在 PC 上的同事构建它,对他来说,从 kableExtra 调用 save_kable() 时文件写入失败包。

我们没有从中得到任何输出。没有 pdf 也没有错误消息。

一个简单的可重现示例,以同样的方式失败,如下所示:

library(knitr)
library(here)
library(kableExtra)

outfile = here("test_table.png")
table = head(iris)
latex =  kable(x = table, format = "html")
save_kable(x = latex, file = outfile)

使用 as_image() 时,我们收到以下“找不到文件”错误:

include_graphics(temp_png, dpi = img_dpi) 错误: 找不到文件:“C:/R Projects/export-anova/test.pdf”

blogdown 的上下文中是 talked about before。但这不是我们的背景。

其他可能相关的花絮:

  1. 我们可以用 format = 'html' 保存 table 个图像,但它们的格式不正确。我们想要 booktabs.
  2. 如果我们使用上面的代码输出 LaTeX 代码,而不是文件,然后使用 RMarkdown 编织,我们确实得到了正确的输出,但它是一个需要裁剪的整页文档。
  3. 扩展名为 .pdf、.png 和 .jpeg 的结果相同

运行 Windows 10,R 版本 4.1.2,kableExtra 版本 1.3.4。 RStudio 中的 LaTeX 设置如下。

有什么想法吗?好像我们很亲近!

问题原来是缺少 LaTeX 依赖项。 kableExtra 包创建了一个 .tex 文件,其中包含一长串所需的包(见下文),但是我们使用的 Tex 发行版 MikTex 无法自动安装它们,并且没有出现错误通过一些有用的细节传播到 R。Here is a post

有很多解决方案,每个解决方案都适用于不同的分布。

  1. 使用 TexLive,而不是 MikTex。我在我的 Mac 上使用 TexLive,它似乎可以轻松找到并安装依赖项。缺点是它很大(>7GB 到 MikTex 的 <1GB)。

  2. 对于 MikTex,您可以结合两种方法来下载软件包。首先,在 kableExtra::save_kable() 中设置 keep_tex = TRUE,这将生成用于编译的 .tex 文件。接下来,在命令行中用 xelatex yourtable.tex 编译它。您不能使用 latex yourtable.tex,因为 this compiler can't work with the required fontspec package. This may download all that you need. If it doesn't, check the log file for a missing .sty file: we needed to manually download the tabu package. You can manually install the missing files 来自 MikTex 控制台:Packages > Search for "tabu" > "+" to install。冲洗,重复,直到您拥有所需的所有包装。您可以为所有依赖项执行此操作,但有很多,所以不妨让编译器先做尽可能多的工作,然后根据需要回填。

  3. TinyTex in R编译。如上所述创建 .tex 文件 (`keep_tex = TRUE')。那么:

install.packages("tinytex")
tinytex::install_tinytex()
tinytex::xelatex("mytable.tex")

TinyTex 会自动下载所需的包并编译成 pdf。好处是您不需要功能强大的 Tex 发行版,但您需要添加创建 tex 文件的步骤,然后手动编译。

这是为上述示例生成的 .tex 文件:

\documentclass[border=1mm, preview]{standalone}
\usepackage[active,tightpage]{preview}
\usepackage{varwidth}
\usepackage{amssymb, amsmath}
\usepackage{ifxetex,ifluatex}
\usepackage{fixltx2e}
\usepackage{polyglossia}
\usepackage{booktabs}
\usepackage{longtable}
\usepackage{array}
\usepackage{multirow}
\usepackage{wrapfig}
\usepackage{float}
\usepackage{colortbl}
\usepackage{pdflscape}
\usepackage{tabu}
\usepackage{threeparttable}
\usepackage{threeparttablex}
\usepackage[normalem]{ulem}
\usepackage[utf8]{inputenc}
\usepackage{makecell}
\usepackage{xcolor}
\usepackage{graphicx}
\usepackage{xltxtra,xunicode}
\usepackage{xcolor}
\begin{document}

\begin{tabular}{rrrrl}
\toprule
Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species\
\midrule
5.1 & 3.5 & 1.4 & 0.2 & setosa\
4.9 & 3.0 & 1.4 & 0.2 & setosa\
4.7 & 3.2 & 1.3 & 0.2 & setosa\
4.6 & 3.1 & 1.5 & 0.2 & setosa\
5.0 & 3.6 & 1.4 & 0.2 & setosa\
5.4 & 3.9 & 1.7 & 0.4 & setosa\
\bottomrule
\end{tabular}
\end{document}