将条件应用于 pander 中 table 的单个列

Applying a criterion to a single column of a table in pander

我想应用一个标准,根据该标准将 pander table 中的单元格设为粗体或不设为粗体。但是我想将此标准应用于 table 的单个列而不是其他列。

这是完整的降价文档。

---
title: "Untitled"
output: pdf_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```


```{r toy data}

pVal <- as.character(c(0.9, 0.04, 0.6, 0.0003))
FVal <- as.character(c(0.03, 2.51, 1.7, 32.1))
Group <- c("A", "B", "C", "D")
df <- data.frame(Group, FVal, pVal, stringsAsFactors = FALSE)

library(pander)

emphasize.strong.cells(which(df < 0.05, arr.ind = TRUE))

pander(df)
```

这里有两个问题。

首先是 FVal 列中满足标准的值也加粗了。我希望 pVal 列中的值 <.05 加粗 only。我尝试像这样

emphasize.strong.cells 函数中进行子集化
emphasize.strong.cells(which(df$pVal < 0.05, arr.ind = TRUE))

emphasize.strong.cells(which(df[,"pVal"] < 0.05, arr.ind = TRUE))

但都没有用。我怀疑发生这种情况是因为以这种方式进行子集化我没有给 emphasize.strong.cells 函数一个具有多个维度的对象,但我不确定如何制作一个对象,其中只有一列是 'active' 作为标准.

第二个问题是 pVal 列中的最后一个元素在最终的 rmarkdown pdf 中没有加粗,我假设是因为转换为科学记数法。

非常感谢任何解决方案。

这个简单的 hack 将为您解决。

df$pVal <- ifelse(df$pVal < 0.05, paste0("**", df$pVal, "**"), df$pVal)
pander(df)


-----------------------
 Group   FVal    pVal  
------- ------ --------
   A     0.03    0.9   

   B     2.51  **0.04**

   C     1.7     0.6   

   D     32.1   3e-04  
-----------------------

如果将 pVal 更改为 as.numeric,最终值也会变为粗体。

我认为这是一个 matrix 操作问题,而不是特定于 pander,因为 emphasize.cells 接受 which(..., arr.ind = TRUE) 返回的 matrix 即如果我对这个问题的理解是正确的,将被过滤到第 3 列。参见例如:

> emphasize.strong.cells(as.matrix(subset(data.frame(which(df < 0.05, arr.ind = TRUE)), col == 3)))
> pander(df)

-----------------------
 Group   FVal    pVal  
------- ------ --------
   A     0.03    0.9   

   B     2.51  **0.04**

   C     1.7     0.6   

   D     32.1   3e-04  
-----------------------