【问题标题】:Format multiple flextable columns by user defined function通过用户定义的函数格式化多个弹性表列
【发布时间】:2020-03-30 10:17:12
【问题描述】:

有没有办法以百万为单位显示弹性表格中的数值?

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

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

谢谢!

【问题讨论】:

    标签: r flextable officer


    【解决方案1】:

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

    【讨论】:

    • 你不应该使用内部结构(即table$body$dataset),因为不能保证以后不会改变......
    • 如果你可以在你提供的函数中添加一个演示,这将对 Popescu 很有帮助。我认为您的功能将帮助我解决类似的问题,但我无法使其适应我的需要。是否可以提供带有演示数据集的示例?谢谢。
    【解决方案2】:

    你可以试试这个代码:

    
    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)
    
    

    【讨论】:

    • 亲爱的大卫,如何将set_caption(ft, "Hello") 中的字体加粗还有一种方法可以在单个 HTML 页面上显示多个单独的表格吗?非常感谢,礼萨
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多