使用“flextable”更改在稀疏表中打印零的方式

Changing how zeros are printed in sparse tables using `flextable`

我使用 knitr 中的 kable() 在 Microsoft Word 中生成了漂亮的 table 输出。但是,kable() 被设计为一个简单的 table 生成器,无法提供 flextable 具有的所有高级功能;例如,包含页脚。

有时,我想打印一个过于稀疏的 table 并将其包含在 Microsoft Word 文档中。我不想打印零,而是想使用 prettyNum().

中的 zero.print 参数来抑制它们

对于 kable,我可以添加一个 format.arg() 参数来指定是否打印零(传递给 format(),然后传递给 prettyNum()

是否可以在 flextable 中添加类似的功能?这将使 flextable 可以做 kable 可以做的所有事情,然后再做一些,使它成为一个有价值的包。最好添加的函数可能是 colformat_num()。是否可以添加一个 ... 参数,将附加参数传递给 prettyNum()formatC()

  A <- tibble::as_tibble(matrix(c(rep(0, 9), rep(1,3)), nrow = 4, dimnames = list(NULL, LETTERS[1:3])))

knitr::kable(A, caption = "Example -- with zeros")
A   B   C
0   0   0
0   0   1
0   0   1
0   0   1
Example – with zeros

knitr::kable(A, caption = "Example -- zeros suppresed. A pattern in this example table is more easy to spot",
             format.args = list(zero.print = ".")  #Make all the zeros be a dot.
)
A   B   C
.   .   .
.   .   1
.   .   1
.   .   1
Example – zeros suppressed. A pattern in this example table is easier to spot

flextable::flextable(A)

我们可以在用 flextable 包包装之前准备好我们的数据。

```{r}
library(tidyverse)
library(flextable)

A <- tibble::as_tibble(matrix(c(rep(0, 9), rep(1,3)), nrow = 4, dimnames = list(NULL, LETTERS[1:3])))


A1 <- A %>% mutate_if(is.numeric, str_replace_all, pattern = "0", replacement = ".")


flextable(A1) %>% 
  set_caption(., "I'm a beautiful table")
```  

您可以使用任何已定义的格式化程序并将其与函数一起使用 set_formatter()

library(tidyverse)
library(flextable)

A <- tibble::as_tibble(matrix(c(rep(0, 9), rep(1,3)), nrow = 4, dimnames = list(NULL, LETTERS[1:3])))

fun <- function(x) {
  z <- formatC(x)
  z[x < 0.001] <- "."
  z
}
fun_all_cols <- lapply(colnames(A), function(x) fun)
names(fun_all_cols) <- colnames(A)

flextable(A) %>% 
  set_formatter(values = fun_all_cols)