首页 > 解决方案 > 使用弹性表编程

问题描述

我有一个生成具有以下结构的数据帧的函数:

df <- data.frame(selected.variable = paste(letters[1:5], '_'),
             percentage = c(50, 20, 10, 10, 10))

来自更大的数据框。

也就是说,在我正在使用的数据框中,有一列带有所选变量的标签,第二列给出了出现该标签的情况的百分比。

我想使用包 flextable https://github.com/davidgohel/flextable创建这些数据帧的表。我可以使用如下代码直接执行此操作:

percent_format <- function(x){
  sprintf("%.1f %%", x)
}

labels_format <- function(x) {
  x <- gsub(pattern = '_', replacement = '', x = x)
  return(x)
}

table <- regulartable(df) 
table <- set_header_labels(table, selected.variable = 'New name', percentage = 'Percentage')
table <- set_formatter(table, selected.variable = labels_format, 
                       percentage = percent_format)

我想编写一个函数,以编程方式更新所选变量的名称和格式 - 如下所示:

make.flextable <- function(data, variable, variable.name) {

percent_format <- function(x){
      sprintf("%.1f %%", x)
    }

    labels_format <- function(x) {
      x <- gsub(pattern = '_', replacement = ' ', x = x)
      return(x)
    }

    table <- regulartable(data) 
    table <- set_header_labels(table, variable = variable.name, percentage = 'Percentage')
    table <- set_formatter(table, variable = labels_format, 
                           percentage = percent_format)

return(table)
} 

但是,我无法弄清楚如何将所选变量的名称(例如,上面示例中的“selected.variable”)传递给 flextable。我尝试按照这个问题使用 map2 函数:

在嵌套数据框中,将信息从一个列表列传递到另一列中应用的函数

但未能使其工作。

标签: rflextable

解决方案


Since few days, a new version is available on github (soon on cran), please update if possible as the below code is only tested with the new version. I am not sure this was what you wanted but at least the example show some code that could be reused :

library(flextable)

labels_format <- function(x) {
  x <- gsub(pattern = '_', replacement = ' ', x = x)
  return(x)
}
percent_format <- function(x){
  sprintf("%.1f %%", x)
}


make.flextable <- function(data, percent_variables, label_variables, labels ) {

  table <- flextable(data) 

  table <- set_header_labels(table, values = labels)

  # a simple function to format number
  table <- colformat_num(table, col_keys = percent_variables, digits = 1, suffix = "%" )

  # how to do with labels_format, create a named list
  args <- rep(list(labels_format), length(label_variables))
  names(args) <- label_variables

  # older versions :
  # table <- do.call(set_formatter, append(args, list(x=table) ) )
  table <- set_formatter(table, values = args )

  table <- set_header_labels(table, values = labels)
  # older versions :
  # table <- do.call(set_header_labels, append(labels, list(x=table) ) )
  return(autofit(table))
} 

df <- data.frame(selected.variable = paste(letters[1:5], '_'),
                 percentage = c(50, 20, 10, 10, 10), stringsAsFactors = FALSE)
ft <- make.flextable(df, 
               percent_variables = 'percentage', 
               label_variables = "selected.variable", 
               labels = list(selected.variable = "new name", 
                             percentage = "Percentage"
                             ))

print(ft)

enter image description here


推荐阅读