通过用户定义的函数格式化多个灵活列

Format multiple flextable columns by user defined function

有没有办法以百万为单位显示 flextable 中的数值?

我不想在创建 flextable 之前将数据集中的数字除以 1000000。

例如,我想将数字 1983445678 显示为 1,983 或 1,983.4 或 1,983.4€

如果没有,是否可以实现一个新函数,可能类似于 set_formatter 或 colformat_num,允许您使用用户定义的函数格式化多列?

由于我的数据集中的某些列是在运行时动态生成的(例如,在使用展开函数之后),我无法使用函数 set_formatter 来格式化新列,因为我不知道列的名称专栏呢,当我写代码的时候。当然,我可以在运行时检测到这个名称,因此使用用户定义的函数格式化这些新列并接受输入的函数将很有用,列的名称将被格式化为字符串。

应该是这样的:

my_data %>%
regulartable %>%
col_format_by_udf(j = c("Europe", "Asia", "Australia"), million_format)

...或类似的东西:

my_data %>%
regulartable %>%
col_format_num_by_udf(million_format)

所有数字列的格式均以百万为单位

谢谢!

目前,我定义了一个函数来解决我的问题。如果可以将类似的东西直接插入到 flextable 包中,这将很有用。

colformat_num_udf <- function(table, j = NULL, udf_function_name = NULL) {

  if (is.null(udf_function_name) | is.null(table))
    return(table)

  if (is.null(j))
    input_columns <- names(table$body$dataset)
  else if(is.numeric(j))
    input_columns <- names(table$body$dataset)[j]
  else
    input_columns <- j

  numeric_columns <- table$body$dataset %>% select_if(is.numeric) %>% names() %>% intersect(input_columns)

  if (length(numeric_columns) == 0)
    return(table)

  rExpression = paste0("table <- set_formatter(table,`", numeric_columns, "` = ", udf_function_name, ")")
  eval(parse(text = rExpression))

  table
}

你可以试试这个代码:


library(magrittr)

dummy_fun <- function(x){
  sprintf("%0.02f", x*1000+pi)
}
funs <- setNames(rep(list(fun), 4), names(iris)[-5])
flextable(head(iris)) %>% 
  set_formatter(values = funs)