簡體   English   中英

通過用戶定義的函數格式化多個 flextable 列

[英]Format multiple flextable columns by user defined function

有沒有辦法在 flextable 中以百萬為單位顯示數值?

在創建 flextable 之前,我不想將數據集中的數字除以 1000000。

例如,我想將數字 1983445678 顯示為 1,983 或 1,983.4 或 1,983.4€

如果沒有,是否可以實現一個新函數,可能類似於 set_formatter 或 colformat_num 允許您使用用戶定義的函數格式化多個列?

由於我的數據集中的某些列是在運行時動態生成的(例如在使用 spread 函數之后),我無法使用函數 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)

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM