Home > Software engineering >  Pasting within a function used to print with kableExtra
Pasting within a function used to print with kableExtra

Time:11-21

I use kableExtra for producing several tables and I'd like to use a function instead of repeating all the code. But with my limited knowledge of R, I am not able to.

Below is a simplified example (so simple it doesn't show why I want to collapse all the code into a function). First code without any added convenience function.

library(kableExtra)
library(glue)
library(tidyverse)

data <- mtcars[1:10, ] |> select(mpg, cyl, am, carb)

# KableExtra, without added convenience function 
kbl(data, booktabs = T, linesep = "", digits = 2,
        caption = "Ordinary kbl()") |>
        add_header_above(c(" ", "Engine" = 2 , "Other" = 2))
        )

Trying to make the same, now with a function where different calls can use different arguments for caption and added headers. The caption part works fine, it's the added headers I'm struggling with.

# Call kableExtra with a function
print_kable <- function(df, caption, header) {
    kbl(data, booktabs = T, linesep = "", digits = 2,
        # Caption works fine
        caption = caption) |>
        # I'm unable to develop code that uses a string argument here
        add_header_above(c(header))           # 1 col instead of 5
        # add_header_above(c({header}))       # Same here
        # add_header_above(c({{header}}))     # and here
        # add_header_above(c("{header}"))     # and here
        # add_header_above(c("{{header}}"))   # and here
        # add_header_above(c(glue({header}))) # and here
        # add_header_above(c(paste(header)))  # and here

}

Kable should print with the code below

print_kable(mtcars, caption = "kbl() called with a function", 
            header = ' " ", "Engine" = 2 , "Other" = 2 ')

Here is a related question: How to evaluate a glue expression in a nested function?

CodePudding user response:

Placing the function c() in the function call rather than in the function itself works fine. Is this what you're looking for?

print_kable <- function(df, caption, header) {
  kbl(data, booktabs = T, linesep = "", digits = 2,
      caption = caption) |>
    add_header_above(header)
}

print_kable(mtcars, caption = "kbl() called with a function", 
            header = c(" ", "Engine" = 2 , "Other" = 2))
  • Related