R knitr 如何在表头中加入换行符 kable()函数

13

我正在使用knitr生成一些报告。我使用kable在文档中生成HTML表格。在表头中,我希望使用换行符(或其他HTML标记)来增强表格。

<!--begin.rcode results='asis'
s <- rbind(c(1,2,3,4),c(1,2,3,4),c(1,2,3,4))
kable(s, col.names=c("Try Newline\nn","Try HTML break<br>%","Past 6 months\nn","\n%"))
end.rcode-->

正如您所看到的,我正在尝试不同的选项,但并没有取得太大的成功。在我的结果中,换行符(\n)只是在 HTML 源代码中转换为换行符。
标签被转换为 HTML 特殊字符。

有什么建议吗?


s是什么?请提供一个可重现的示例,以便“我们可以看到”问题。 - daroczig
修改了问题,这样你就可以看到问题所在了。 - Wietze314
4个回答

13
据我所知,管道表格语法不支持单元格内的换行符,因此如果使用pandoc将Markdown转换为HTML(这是RStudio使用的),则最好选择一些更丰富的表格语法,例如multilinegrid。不确定如何在kable中实现这一点,但pander支持这些功能:
> library(pander)
> colnames(s) <- c("Try Newline\nn","Try HTML break<br>%","Past 6 months\nn","\n%")
> pander(s, keep.line.breaks = TRUE)

-------------------------------------------------------
 Try Newline   Try HTML break<br>%   Past 6 months   % 
      n                                    n           
------------- --------------------- --------------- ---
      1                 2                  3         4 

      1                 2                  3         4 

      1                 2                  3         4 
-------------------------------------------------------

但是这还不够,因为 pandoc 会自动删除换行符,所以您需要根据相关文档放置硬换行符(“反斜杠后跟换行符”)。例如,以下代码将按预期转换为 HTML:

> colnames(s) <- c("Try Newline\\\nn","Try HTML break\\\n%","Past 6 months\\\nn","\\\n%")
> pander(s, keep.line.breaks = TRUE)

-----------------------------------------------------
 Try Newline\   Try HTML break\   Past 6 months\   \ 
      n                %                n          % 
-------------- ----------------- ---------------- ---
      1                2                3          4 

      1                2                3          4 

      1                2                3          4 
-----------------------------------------------------

3
使用 knitr v1.13 版本,如果您将输出指定为 html,那么硬断行符在 kable 中可以正常工作:knitr::kable(s, format = "html") - r_alanb
1
太好了。有没有办法在 format = "latex" 时使其工作? - ben
@ben 是的。请看我的回答。 - undefined

4

有一种方法可以限制列宽,在kable中可以使用column_spec()来实现。您可以指定列和不同单位(如cm,in,em)的宽度。


2
看起来 kable 将 <> 转换成 HTML 等价物,即 "&lt;""&gt;",因此我有一个快速的解决方案,只要您不需要在其他地方使用 <>。这使我得以在表格中的列标题中获得换行符。
基本上,一旦您的表格完成,只需在 HTML 中用 < 和 > 替换 "&lt;""&gt;",然后将其保存为 HTML 文件。就像这样:
tbl_output <- gsub("&lt;", "<", tbl_output)
tbl_output <- gsub("&gt;", ">", tbl_output)

write(tbl_output, "TableOutput.html")

如果tbl_output是kable的输出结果,可以使用以下方法进行换行。

或者,如果您需要在表格中其他地方使用<>,则可以创建自己的换行字符串,然后在最后使用gsub将其替换为<br>

注:kable是一个R语言包,用于生成漂亮的表格。


很整洁。为什么不例如使用 <br> 因为它很熟悉,然后 gsub("&lt;br&gt;", "<br>", tbl_output) 呢? - tjebo

0
使用latex输出,您可以使用makecell LaTeX包,以及escape=FALSEescape=FALSE将防止在中间的LaTeX输出中将\\替换为\textbackslash{}
这是一个MWE示例:
---
header-includes:
- \usepackage{makecell}
output: beamer_presentation
---

# Ch 1

## Ch 1.1

```{r, echo=FALSE}
library(kableExtra)
s <- rbind(c(1,2,3,4),c(1,2,3,4),c(1,2,3,4))
cnames <- c("\\makecell[ct]{Distance\\\\km}",
                     "\\makecell[ct]{Power\\\\W}",
                     "\\makecell[ct]{Energy\\\\J}",
                     "\\makecell[ct]{Pressure\\\\Pa}")
kable(s, col.names=cnames, escape=FALSE)

enter image description here


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