通过用户定义的功能设置多个可伸缩列的格式

时间:2019-12-05 13:07:03

标签: r flextable officer

有没有一种方法可以显示以百万为单位的柔性表中的数值?

我不想在创建弹性表之前将数据集中的数字除以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)

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

谢谢!

2 个答案:

答案 0 :(得分:0)

目前,我定义了一个可以解决我的问题的函数。如果可以将类似或更详细的内容直接插入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
}

答案 1 :(得分:0)

您可以尝试使用以下代码:

flux.mapNotNull { it.name?.toUpperCase() }

enter image description here