代码之家  ›  专栏  ›  技术社区  ›  Jake Thompson

停止knitr剥离kable中的填充空间

  •  0
  • Jake Thompson  · 技术社区  · 7 年前

    ---
    output:
      pdf_document:
        keep_tex: true
    ---
    
    ```{r, include = FALSE}
    library(tidyverse)
    library(knitr)
    library(kableExtra)
    ```
    
    ```{r}
    df <- data_frame(
      level = c("Level 1", "Level 2", "Level 3", "Level 4"),     
      cat1_1 = c("39.5", "25.1", "28.9", "6.6"),
      cat2_1 = c("37.7", "26.1", "30.0", "6.2"),
      cat3_1 = c("30.3", "23.3", "29.7", "16.7"),
      cat1_2 = c("58.7", "29.1", "9.9", "2.3"),
      cat2_2 = c("56.4", "30.3", "10.7", "2.5"),
      cat3_2 = c("43.6", "31.4", "16.8", "8.1")
    )
    
    
    kable(df, format = "latex", align = "c", booktabs = TRUE, escape = TRUE,
      col.names = c("Level", "Cat1", "Cat2", "Cat3", "Cat4", "Cat5", "Cat6"),
      caption = "Percentage of Respondents in Each Category by Level and Group") %>%
      kable_styling(latex_options = "HOLD_position", full_width = TRUE) %>%
      column_spec(1, width = "12em") %>%
      row_spec(0, bold = TRUE, align = "c") %>%
      add_header_above(c(" " = 1, "Group 1 (%)" = 3,
        "Group 2 (%)" = 3), bold = TRUE)
    ```
    

    enter image description here

    我想要的是使列居中,但在小数点对齐。我从这里和这里了解到,目前不支持“S”列对齐,这很好。作为一种解决方法,我打算右对齐,然后在末端添加带有额外空格的焊盘,以将数字推回中心:

    ---
    output:
      pdf_document:
        keep_tex: true
    ---
    
    ```{r, include = FALSE}
    library(tidyverse)
    library(knitr)
    library(kableExtra)
    ```
    
    ```{r}
    df <- data_frame(
      level = c("Level 1", "Level 2", "Level 3", "Level 4"),     
      cat1_1 = c("39.5", "25.1", "28.9", "6.6"),
      cat2_1 = c("37.7", "26.1", "30.0", "6.2"),
      cat3_1 = c("30.3", "23.3", "29.7", "16.7"),
      cat1_2 = c("58.7", "29.1", "9.9", "2.3"),
      cat2_2 = c("56.4", "30.3", "10.7", "2.5"),
      cat3_2 = c("43.6", "31.4", "16.8", "8.1")
    ) %>%
      mutate_at(vars(contains("_")), funs(paste0(., paste(rep(" ", 4), collapse = ""))))
    df
    ```
    
    ```{r}
    kable(df, format = "latex", align = c("l", rep("r", 6)), booktabs = TRUE,
      col.names = c("Level", "Cat1", "Cat2", "Cat3", "Cat4", "Cat5", "Cat6"),
      caption = "Percentage of Respondents in Each Category by Level and Group") %>%
      kable_styling(latex_options = "HOLD_position", full_width = TRUE) %>%
      column_spec(1, width = "7em") %>%
      row_spec(0, bold = TRUE, align = "c") %>%
      add_header_above(c(" " = 1, "Group 1 (%)" = 3,
        "Group 2 (%)" = 3), bold = TRUE)
    ```
    

    enter image description here

    \begin{table}[H]
    
    \caption{\label{tab:unnamed-chunk-3}Percentage of Respondents in Each Category by Level and Group}
    \centering
    \begin{tabu} to \linewidth {>{\raggedright\arraybackslash}p{7em}>{\raggedleft}X>{\raggedleft}X>{\raggedleft}X>{\raggedleft}X>{\raggedleft}X>{\raggedleft}X}
    \toprule
    \multicolumn{1}{c}{\textbf{ }} & \multicolumn{3}{c}{\textbf{Group 1 (\%)}} & \multicolumn{3}{c}{\textbf{Group 2 (\%)}} \\
    \cmidrule(l{3pt}r{3pt}){2-4} \cmidrule(l{3pt}r{3pt}){5-7}
    \multicolumn{1}{>{\centering\arraybackslash}p{7em}}{\textbf{Level}} & \multicolumn{1}{c}{\textbf{Cat1}} & \multicolumn{1}{c}{\textbf{Cat2}} & \multicolumn{1}{c}{\textbf{Cat3}} & \multicolumn{1}{c}{\textbf{Cat4}} & \multicolumn{1}{c}{\textbf{Cat5}} & \multicolumn{1}{c}{\textbf{Cat6}}\\
    \midrule
    Level 1 & 39.5 & 37.7 & 30.3 & 58.7 & 56.4 & 43.6\\
    Level 2 & 25.1 & 26.1 & 23.3 & 29.1 & 30.3 & 31.4\\
    Level 3 & 28.9 & 30.0 & 29.7 & 9.9 & 10.7 & 16.8\\
    Level 4 & 6.6 & 6.2 & 16.7 & 2.3 & 2.5 & 8.1\\
    \bottomrule
    \end{tabu}
    \end{table}
    

    df <- data_frame(
      level = c("Level 1", "Level 2", "Level 3", "Level 4"),     
      cat1_1 = c("39.5", "25.1", "28.9", "6.6"),
      cat2_1 = c("37.7", "26.1", "30.0", "6.2"),
      cat3_1 = c("30.3", "23.3", "29.7", "16.7"),
      cat1_2 = c("58.7", "29.1", "9.9", "2.3"),
      cat2_2 = c("56.4", "30.3", "10.7", "2.5"),
      cat3_2 = c("43.6", "31.4", "16.8", "8.1")
    ) %>%
      mutate_at(vars(contains("_")), funs(paste0(., paste(rep(" ", 4), collapse = "")))) %>%
      mutate_at(vars(contains("_")), str_replace_all, " ", fixed("\\\\ "))
    
    df
    #> # A tibble: 4 x 7
    #>   level  cat1_1     cat2_1     cat3_1     cat1_2     cat2_2     cat3_2    
    #>   <chr>  <chr>      <chr>      <chr>      <chr>      <chr>      <chr>     
    #> 1 Level… "39.5\\ \… "37.7\\ \… "30.3\\ \… "58.7\\ \… "56.4\\ \… "43.6\\ \…
    #> 2 Level… "25.1\\ \… "26.1\\ \… "23.3\\ \… "29.1\\ \… "30.3\\ \… "31.4\\ \…
    #> 3 Level… "28.9\\ \… "30.0\\ \… "29.7\\ \… "9.9\\ \\… "10.7\\ \… "16.8\\ \…
    #> 4 Level… "6.6\\ \\… "6.2\\ \\… "16.7\\ \… "2.3\\ \\… "2.5\\ \\… "8.1\\ \\…
    

    但我在尝试编织文档时遇到以下错误:

    ! Misplaced \noalign.
    \bottomrule ->\noalign 
                           {\ifnum 0=`}\fi \@aboverulesep =\aboverulesep \global...
    l.202 \end{tabu}
    
    Error: Failed to compile add_space.tex. See add_space.log for more info.
    

    同样,查看原始乳胶也有一定的参考价值:

    \begin{table}[H]
    
    \caption{\label{tab:unnamed-chunk-3}Percentage of Respondents in Each Category by Level and Group}
    \centering
    \begin{tabu} to \linewidth {>{\raggedright\arraybackslash}p{7em}>{\raggedleft}X>{\raggedleft}X>{\raggedleft}X>{\raggedleft}X>{\raggedleft}X>{\raggedleft}X}
    \toprule
    \multicolumn{1}{c}{\textbf{ }} & \multicolumn{3}{c}{\textbf{Group 1 (\%)}} & \multicolumn{3}{c}{\textbf{Group 2 (\%)}} \\
    \cmidrule(l{3pt}r{3pt}){2-4} \cmidrule(l{3pt}r{3pt}){5-7}
    \multicolumn{1}{>{\centering\arraybackslash}p{7em}}{\textbf{Level}} & \multicolumn{1}{c}{\textbf{Cat1}} & \multicolumn{1}{c}{\textbf{Cat2}} & \multicolumn{1}{c}{\textbf{Cat3}} & \multicolumn{1}{c}{\textbf{Cat4}} & \multicolumn{1}{c}{\textbf{Cat5}} & \multicolumn{1}{c}{\textbf{Cat6}}\\
    \midrule
    Level 1 & 39.5\ \ \ \ & 37.7\ \ \ \ & 30.3\ \ \ \ & 58.7\ \ \ \ & 56.4\ \ \ \ & 43.6\ \ \ \\\
    Level 2 & 25.1\ \ \ \ & 26.1\ \ \ \ & 23.3\ \ \ \ & 29.1\ \ \ \ & 30.3\ \ \ \ & 31.4\ \ \ \\\
    Level 3 & 28.9\ \ \ \ & 30.0\ \ \ \ & 29.7\ \ \ \ & 9.9\ \ \ \ & 10.7\ \ \ \ & 16.8\ \ \ \\\
    Level 4 & 6.6\ \ \ \ & 6.2\ \ \ \ & 16.7\ \ \ \ & 2.3\ \ \ \ & 2.5\ \ \ \ & 8.1\ \ \ \\\
    \bottomrule
    \end{tabu}
    \end{table}
    

    \\\ . 编织pdf文档时是否有办法保持填充空间?或者有没有更好的方法来实现居中、十进制对齐的列?

    0 回复  |  直到 7 年前