从RMarkdown代码块生成Latex代码

3

我有一个小标题,想要在报告的顶部打印出来。最终应该看起来像这样:

enter image description here

这份报告是由RMarkdown/Knitr生成的。我混合使用Latex以获得所需的格式。数据基于我从REST查询中提取结果生成的表格。在R中,数据框看起来像:

enter image description here

我编写了LaTex代码以获得所需的结果,代码如下:

\begin{spacing}{.7}
\begin{center}
ECC \begin{tabular}{|C|C|} \hline \cellcolor{red} \textbf{\scriptsize \textcolor{white}{TOUCH}} & \textbf{\scriptsize NO TOUCH} \\ \hline \end{tabular} \hspace{.9em}
DOC \begin{tabular}{|C|C|} \hline \textbf{\scriptsize TOUCH} & \textbf{\scriptsize NO TOUCH} \\ \hline \end{tabular} \hspace{.9em}
CCC \begin{tabular}{|C|C|} \hline \textbf{\scriptsize TOUCH} & \textbf{\scriptsize NO TOUCH} \\ \hline \end{tabular} \hspace{.9em}
GEN \begin{tabular}{|C|C|} \hline \textbf{\scriptsize TOUCH} & \textbf{\scriptsize NO TOUCH} \\ \hline \end{tabular} \hspace{.9em}
IT \begin{tabular}{|C|C|} \hline \textbf{\scriptsize TOUCH} & \textbf{\scriptsize NO TOUCH} \\ \hline \end{tabular} \hspace{.9em}
\end{center}
\end{spacing}

到目前为止,一切都很好。但是文本和单元格颜色需要是动态的。标准如下:
  1. 如果环境是“触摸”环境,则该单元格应呈绿色,文本应呈白色。
  2. 如果环境是“非触摸”环境,则该单元格应呈红色,文本应呈白色。
  3. 每个部分未着色的单元格应具有白色背景和黑色文本。
不难,我在报告中创建了一个代码块,包含在 \begin{center}\begin{spacing}{.7} 项中,看起来像这样:
```{r echo = FALSE, warning = FALSE, message=FALSE, results='asis'}
# Add row to data frame to build table options
touchNoTouchDF$tableOption <- NA

for(i in 1:nrow(touchNoTouchDF)) {
  if(strsplit(touchNoTouchDF[i,1], ":")[[1]][2] == "Touch") {
    touchNoTouchDF[i,2] <- paste(strsplit(touchNoTouchDF[i,1], ":")[[1]][1],"\\begin{tabular}{|C|C|} \\hline \\cellcolor{OliveGreen!85} \\textbf{\\scriptsize \\textcolor{white}{TOUCH}} \& \\textbf{\\scriptsize NO TOUCH} \\newline \\hline \\end{tabular} \\hspace{.9em}")
  } else {
    touchNoTouchDF[i,2] <- paste(strsplit(touchNoTouchDF[i,1], ":")[[1]][1],"\\begin{tabular}{|C|C|} \\hline \\textbf{\\scriptsize TOUCH} \& \\cellcolor{red} \\textbf{\\scriptsize \\textcolor{white}{NO TOUCH}} \\newline \\hline \\end{tabular} \\hspace{.9em}")
  }
}

for(i in 1: nrow(touchNoTouchDF)) {
  print(touchNoTouchDF[i,2])
}
```

我在这里做的是创建一个外观,根据第一列包含的内容,在数据框的不同列中生成正确的LaTex代码。运行那个循环后,我得到了你在上面看到的数据框。到目前为止,非常好。现在我的问题来了。我想让R代码块打印出LaTex,以便呈现。我认为使用简单的for循环和print语句就可以解决,但没成功。我尝试了cat(),但也不起作用。
我困惑于如何将最后一行的内容打印出来,以便生成的pdf报告包含该图形表示。有什么想法吗?提示?我相信这很简单,但我已经做了几个小时并且以各种方式搜索了谷歌......提前感谢!
编辑:
如请求所示,下面是我得到的输出。我确保使用cat(),如果我手动运行它,它会毫无问题地将LaTex打印到控制台。当我尝试编织文档时,我得到以下结果:
! Misplaced \noalign.
\hline ->\noalign 
                  {\ifnum 0=`}\fi \let \hskip \vskip \let \vrule \hrule \let...
l.143 ...tbf{\scriptsize NO TOUCH} \newline \hline

pandoc.exe: Error producing PDF
Error: pandoc document conversion failed with error 43
In addition: Warning messages:
1: package 'knitr' was built under R version 3.3.2 
2: package 'prettyR' was built under R version 3.3.2 
3: package 'magick' was built under R version 3.3.2 
4: running command '"C:/Users/z10987/AppData/Local/Pandoc/pandoc" +RTS -K512m -RTS pdfReport.utf8.md --to latex --from markdown+autolink_bare_uris+ascii_identifiers+tex_math_single_backslash --output pdfReport.pdf --template "C:\R\R-3.3.1\library\rmarkdown\rmd\latex\default-1.17.0.2.tex" --highlight-style tango --latex-engine xelatex --include-in-header header1.tex --variable graphics=yes' had status 43 
Execution halted

我想,也许是因为我在表格中没有转义 "&",但当我尝试时却得到了:

Error: \& is an unrecognized escape character in string...

再次感谢!

更新:

我找到了解决方法——在表格中,每行末尾原本有一个\\。我试图通过\\\来转义它,但是出现了错误。我认为\\代表换行,所以我决定用\\newline替换它。但是,如果表格末尾没有\\,它会报错。

所以......我把\\放回去了。但是我仍然遇到了转义的问题。突发奇想,我想,“如果一个\转义另一个\,也许我需要两个,一个用于转义每个反斜杠......”我用\\\\替换了\\,然后就成功了。唉,这么简单的事情......我想把这个解决方案发布出来。


你肯定想使用 cat() 而不是 print()。展示一下它打印的内容,以及你遇到的错误或问题。 - user2554330
@user2554330 我在上面的问题末尾添加了输出/错误信息,标题为“EDIT:”。希望这可以帮到您。如果您需要更多信息,请告诉我。感谢您的关注! - azdatasci
@user2554330,我找到了问题所在,它与在执行cat()之前在代码中转义“\”有关。我想你已经考虑到了这一点,如果你想发布这个解决方案,我会接受它。 - azdatasci
1个回答

2

对于发布官方答案,我的错误在于认为我可以用一个“\”来转义“\”,因此我把“\\”粘贴到了我的字符串中。然而,由于每个“\”都必须被转义,我不得不先转义第一个“\”,然后再转义第二个“\”,最终得到“\\”。第一个“\”转义第二个,“第三个”转义第四个。“这可能是一些基础知识,但如果你不注意,很容易犯错。只是想为其他人发布答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接