我能否使用knitr将CSS样式应用于单个表格单元格?

15

使用knitr,是否有可能将类属性应用于单个表格单元格?我已经成功地将类属性应用于包含knitr::kable生成的表格的部分标题,并用它来格式化整个表格。但是,我希望能够有条件地格式化单个单元格,这需要能够将类应用于特定的<td>元素。

我的当前解决方法是以编程方式将单元格内容包装在一对<span>标记中,并将其传递给knitr::kable。这种方法只允许我格式化单元格中的文本,而不是整个单元格(例如设置单元格背景颜色)。以下是我目前正在使用的示例:

## Read in the report, process the data, send to kable
rpt <- generate.report()
mutate(rpt, Col2 = ifelse(abs(Col2) > Threshold,
                          paste('<span class="warning">',
                                sprintf("%.2f", Col2), '</span>'),
                          sprintf("%.2f", Col2))) %>%
  knitr::kable(format="markdown", align = c("l", rep("r", 4)),
               col.names = gsub("\\.", "<br>", colnames(.)))

导致以下示例HTML输出:

<td align="right"><span class="warning"> -1.74 </span></td>

我希望能够使用knitr::kable生成类似于以下内容的表格:

<td align="right" class="warning"> -1.74 </td>

那样我就可以将 CSS 样式应用到 <td> 标签,而不是 <span> 标签。


如果粗体/斜体样式足够满足您的使用情况,那么 pander 为此提供了一个相当用户友好的解决方案:http://rapporter.github.io/pander/#highlighting-cells 当然,您可以使用 JS/CSS 调整强调/斜体的外观,因此上述提到的限制仅意味着您在表格中只能有两种额外的样式。如果有帮助,请让我知道(通过在评论中提及我,例如 @daroczig 以获得电子邮件通知),我可以提供可重现的示例。 - daroczig
@daroczig 感谢您的建议。不幸的是,尽管您的建议产生了漂亮的Markdown输出,正如您明确指出的那样,它只允许使用强调/斜体。我正在寻找一种解决方案,可以在单个单元格上应用更多样化的样式。 - Daddy the Runner
我想到的一个想法是编写一个R函数,用于后处理knitr::kable生成的HTML输出,以查找<span>标签并删除它们,并编辑父级<td>标签。但如果不必经历这种复杂性,我希望能够使用现有的解决方案(如果有的话)。 - Daddy the Runner
2个回答

7

如果涉及it技术相关内容,您可以使用ReporteRs软件包进行翻译。请在此处查看FlexTable

然后,您可以使用函数as.html获取相应的HTML代码,并在您的knitr代码中重复使用它。


1
我仔细研究了FlexTable,同意它相比kable提供了许多很好的增强功能和自定义选项。不幸的是,FlexTable使用嵌入式样式属性来应用所有格式,这就无法使用CSS样式表。(除非我在ReporteRs包中漏掉了什么)。有没有办法在FlexTable中使用类属性而不是样式属性?还是我应该通过GitHub提交一个功能请求? - Daddy the Runner
很遗憾,无法应用 CSS 类属性。 - David Gohel
flextable的链接是https://cran.r-project.org/web/packages/flextable/index.html。 - N Brouwer

0

好的,这可能不是答案,但可能会为您指明方向。我在knitr中遇到了类似的问题,即格式化单个单元格以准备pdf。最后,我使用xtable并编写了一个函数,该函数依赖于逻辑矩阵来决定是否格式化输出表中的单元格。

我自己无法使其顺利运行,因此不得不在这里发布,并在ivyleavedtoadflax的帮助下开发出了一个相当易于使用的函数,以在knitr中应用格式化到某些单元格的xtable中。

这是我的帖子链接

正如我所说,这不是您的问题的确切解决方案,但可能会为您指明方向。


xtable包和ReporteRs的Flextable问题在于默认表格格式不够美观,并且需要用户进行大量操作,特别是在报告中使用了很多表格时。我的奖励的重点是找到一种解决方案,允许单元格级别的格式化,同时不会失去kable()函数的优势。 - Jon Nagra

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