【问题标题】:how to make customised pretty flexable function如何使定制的相当灵活的功能
【发布时间】:2026-02-23 23:35:01
【问题描述】:

我很喜欢 flextable,但是,将它整合到我的工作流程中会导致我无法编写通用函数的问题。

我想要一个能够自动突出显示表头和最后一行的函数。我能够做到这一点,但我必须指定第一列名称的名称。这简直是​​太多的工作,有解决办法吗?

library(tidyverse)
require(flextable)
require(rlang)

# Function that works
my_table <- function(x){
  
  require(flextable)
  require(rlang)
  
  
  x %>% 
    flextable() %>% 
    
    # Header colour and bold
    bg(bg = "#e05297", part = "header") %>% 
    flextable::color(color = "white", part = "header") %>% 
    
    # Last row bold and highlight
    bold(i = ~rowname == "Total", bold = TRUE) %>%
    
    bg(i    = ~rowname == "Total",
       bg    = "grey",
       part = "body")
  
}

mtcars %>% 
  rownames_to_column() %>% 
  adorn_totals("row") %>% 
    
  my_table()


# This is a general purpose function which is not working
my_table <- function(x){
  
  require(flextable)
  require(rlang)
  
  
  first_col_name <- colnames(x) %>% .[1]
  
  x %>% 
    flextable() %>% 
    
    # Header colour and bold
    bg(bg = "#e05297", part = "header") %>% 
    flextable::color(color = "white", part = "header") #%>% 

    
    # Last row bold and highlight
    bold(i = ~eval(rlang::sym(first_col_name)) == "Total", bold = TRUE) %>%
    
    bg(i    = ~eval(rlang::sym(first_col_name)) == "Total",
      bg    = "grey",
       part = "body")
  
}

关于如何使通用my_table 函数起作用的任何想法

【问题讨论】:

    标签: r flextable


    【解决方案1】:

    i 参数还接受要突出显示的数据帧的位置(行号),因此您可以使用nrow 来获取数据帧中的最后一行。

    library(flextable)
    library(janitor)
    
    my_table <- function(x){
      
      x %>% 
        flextable() %>% 
        
        # Header colour and bold
        bg(bg = "#e05297", part = "header") %>% 
        flextable::color(color = "white", part = "header") %>% 
        bold(i = nrow(x), bold = TRUE) %>%
        bg(i = nrow(x),bg = "grey",part = "body")
    }
    
    mtcars %>% 
      rownames_to_column() %>% 
      adorn_totals("row") %>% 
      my_table()
    

    【讨论】:

    • 如果有帮助,还有nrow_part()ncol_keys() 在这些情况下很有用