如何在 flextable 输出中打印数字符号以及其他要求?

问题描述

上下文: Flextable 包(0.6.6 版)使用两种类型的函数来格式化带有数字的列(双精度):colformat_double()set_formatter_type()。第一个具有控制小数和大标记的参数。后者具有 fmt_double 使用的 sprintf 参数(请参阅 ?set_formatter_type)来格式化双列。

预期输出我正在尝试使用以下规则格式化数字列:

  • 使用逗号 (,) 作为小数点,
  • 空间作为大标记
  • 打印/显示数字的符号(即减号 - 和加号 +),
  • 一定数量的数字

预期的输出一个 flextable 格式的数字,例如 + 1 026,56

enter image description here

想法:

您可以使用 sprintf 在数字前显示 +- 符号:

> sprintf("%+1.2f",1.056)
[1] "+1.06"

但我不知道如何告诉 sprintf 使用逗号和空格作为小数和大标记,并且它无法在 flextable 输出显示 +

问题:如何在 flextable 中格式化数字,使用加号或减号,空格作为大号,逗号作为小数点,同时保留指定数字的可能性?

library(flextable)
library(dplyr)

# flextable default number formatting
head(rock) %>% 
  flextable()

enter image description here

# changing big and decimal separator and digits
head(rock) %>% 
  flextable() %>% 
  # here I use colormat_num because area column is intenger
  colformat_num(big.mark = " ",decimal.mark = ",",digits = 2) %>% 
  colformat_double(big.mark = " ",digits = 2)

enter image description here

# displaying "+" in front of numbers does not work
head(rock) %>% 
  flextable() %>% 
  set_formatter_type(
    fmt_double = "%+1.2f",fmt_integer = "%+1.2f"
  )

enter image description here

# while 
sprintf("%+1.2f",1.50) # works
#> [1] "+1.50"

注意:sprintf 可能允许显示“+”号,但我不知道如何设置大分隔符和小数分隔符...

可能的技巧

可以在进入 flextable 函数之前预先格式化数字。但是,它们不被 flextable 视为“数字”,即 colformat_double() 不能使用。

head(rock) %>% 
  mutate(peri = -peri) %>% 
  mutate(across(where(is.numeric),function(x) ifelse(x > 0,paste0("+",format(x,big.mark = " ",digits = 2)),digits = 2)))) %>% 
  flextable() %>% 
  align(align = "right",part = "all")

enter image description here

reprex package (v2.0.0) 于 2021 年 7 月 2 日创建

解决方法

您可以使用 prefixcolformat_numcolformat_double 参数。

library(flextable)

head(rock) %>%
  flextable(cwidth = 0.9) %>% 
  colformat_num(big.mark = " ",decimal.mark = ",",digits = 2,prefix = '+ ') %>% 
  colformat_double(big.mark = " ",prefix = '+ ')

enter image description here