Программирование с помощью flextable

У меня есть функция, которая генерирует фреймы данных со следующей структурой:

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 в соответствии с этим вопросом:

Во вложенном фрейме данных передать информация из одного столбца списка для функции, примененной в другом

но не смогли заставить его работать.


person userLL    schedule 31.01.2019    source источник


Ответы (1)


В течение нескольких дней новая версия доступна на github (скоро на кране), пожалуйста, обновите, если возможно, так как приведенный ниже код тестируется только с новой версией. Я не уверен, что это было то, что вы хотели, но, по крайней мере, в примере показан код, который можно использовать повторно:

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)

введите здесь описание изображения

person David Gohel    schedule 31.01.2019
comment
Очень здорово, спасибо. Одна проблема, с которой я столкнулся: в моей функции фрейм данных (df) был создан внутри функции, и я не преобразовывал его явно во фрейм данных; его структура была классами «tbl_df», «tbl» и «data.frame». В результате переменная «новое имя» печаталась как весь вектор - например, c ('a', 'b', 'c', 'd', 'e'). Я смог исправить это, явно преобразовав df во фрейм данных с помощью stringsAsFactors = F, но я до сих пор не совсем уверен, почему это было необходимо. - person userLL; 01.02.2019
comment
Я также получаю серию ошибок и предупреждений Fontconfig при вязании в Word, но сам связанный документ выглядит нормально - person userLL; 01.02.2019
comment
Я добавил в версию на github инструкцию по преобразованию DT и tibble в базу data.frame. Я вложу этот q позже :) Что касается второго комментария, я не знаю, как помочь, извините. - person David Gohel; 01.02.2019