【问题标题】:Avoid repeating the same styling with kable_styling避免使用 kable_styling 重复相同的样式
【发布时间】:2020-10-17 02:52:06
【问题描述】:

使用 Rmarkdown 和 kable,我需要使用相同格式但具有不同数据集的多个表重复。

例如,在以下两个块中,变化的是DF、用于排序的变量和标题。

有什么办法可以避免为每个块重复 90% 的相同代码?

kable(Crib1 %>% 安排(-Z1) %>%
  select(Ranking = TYP, SID, Statement, FA1:FA3), longtable = TRUE, booktabs = TRUE, caption = "Crib Sheet - Factor 1") %>%
  折叠行(1,latex_hline =“主要”,valign =“顶部”)%>%
  kable_styling(full_width = FALSE, latex_options = c("hold_position", "condensed", "repeat_header"), font_size = 9) %>%
    列规格(1,粗体=真)%>%
    column_spec(3,宽度=“18em”,斜体=真)%>%
    column_spec(4,粗体 = TRUE)
kable(Crib2 %>% 安排(-Z2) %>%
  select(Ranking = TYP, SID, Statement, FA1:FA3), longtable = TRUE, booktabs = TRUE, caption = "Crib Sheet - Factor 2") %>%
  折叠行(1,latex_hline =“主要”,valign =“顶部”)%>%
  kable_styling(full_width = FALSE, latex_options = c("hold_position", "condensed", "repeat_header"), font_size = 9) %>%
    列规格(1,粗体=真)%>%
    column_spec(3,宽度=“18em”,斜体=真)%>%
    column_spec(4,粗体 = TRUE)

我正在尝试构建一个函数

createKableCrib <- function(factor){
  Crib <- rlang::sym(paste("Crib", factor, sep=""))
  Z <- rlang::sym(paste("Z", factor, sep=""))
  cap <- paste("Crib Sheet - Factor", factor, sep=" ")

kable(!!Crib %>% arrange(!!(-Z)) %>%
        select(Ranking = TYP, SID, Statement, FA1:FA3), 
      longtable = TRUE, booktabs = TRUE, caption = cap) %>% 
  collapse_rows(1, latex_hline = "major", valign = "top") %>%
  kable_styling(full_width = FALSE, latex_options = c("hold_position", "condensed", "repeat_header"), font_size = 9) %>%
  column_spec(1, bold=TRUE) %>%
  column_spec(3, width = "18em", italic = TRUE) %>%
  column_spec(4, bold = TRUE)
}

createKableCrib("1")

但我收到以下错误:

Error in UseMethod("arrange_") : 
  no applicable method for 'arrange_' applied to an object of class "name" 

最好的,

达米安

【问题讨论】:

  • 让它成为一个函数?
  • 我正在尝试这样做。我将编辑帖子以显示我正在尝试构建的功能及其引发的问题..

标签: r r-markdown kable kableextra


【解决方案1】:

这是我目前发现的。 不完全令人满意,因为我希望能够在函数中创建 df 名称,但我不断收到错误。

createKableCrib <- function(df, factor){
  Z <- paste("Z", factor, sep="")
  cap <- paste("Crib Sheet - Factor", factor, sep=" ")
 
  kable(df  %>%  arrange_at(.vars=desc(Z)) %>%
        select(Ranking = TYP, SID, Statement, FA1:FA3), 
      longtable = TRUE, booktabs = TRUE, caption = cap) %>% 
  collapse_rows(1, latex_hline = "major", valign = "top") %>%
  kable_styling(full_width = FALSE, latex_options = c("hold_position", "condensed", "repeat_header"), font_size = 9) %>%
  column_spec(1, bold=TRUE) %>%
  column_spec(3, width = "18em", italic = TRUE) %>%
  column_spec(4, bold = TRUE)
}

createKableCrib(Crib1, "1")

【讨论】:

    【解决方案2】:

    看起来您可能已经做到了,但这里有一个示例,似乎可以使用 Curly-Curly 而不是原来的 Bang-Bang (https://www.brodrigues.co/blog/2019-06-20-tidy_eval_saga/)。

    没有您的数据,但尝试使用 mtcars 和 iris。如果您的列相同,您可以在arrange 之后添加select 语句。

    library(dplyr)
    library(knitr)
    library(kableExtra)
    
    create_kable <- function(data, column, title) {
      kable({{data}} %>% 
              arrange({{column}}),
            longtable = TRUE, booktabs = TRUE, caption = title) %>% 
      collapse_rows(1, latex_hline = "major", valign = "top") %>%
      kable_styling(full_width = FALSE, latex_options = c("hold_position", "condensed", "repeat_header"), font_size = 9) %>%
        column_spec(1, bold=TRUE) %>%
        column_spec(3, width = "18em", italic = TRUE) %>%
        column_spec(4, bold = TRUE)
    }
    
    create_kable(mtcars, mpg, "Crib Sheet - Factor 1")
    create_kable(iris, Sepal.Length, "Crib Sheet - Factor 2")
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-07
    • 2014-08-02
    • 2023-03-16
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多