Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
497 views
in Technique[技术] by (71.8m points)

r markdown - Table in Bookdown/Huskydown with several features (Citation, Caption, URL, PNG Figure, ...)

I would like to include a table in an R markdown document (Bookdown/Huskydown) which should meet the following requirements. Ideally, the table works with several output formats, e.g. LaTex/PDF and HTML.

Requirements:

  • Table width: fixed
  • Cell width: fixed
  • Vertical alignment: cell content aligned to the top
  • Text formatting: like bold or italics (best would be if md formatting supported, such that code is output agnostic) and allow for line breaks in longer texts
  • Citations: should be rendered
  • URLs: as clickable links both in HTML and LaTex/PDF
  • Figures: include
    1. figures stored locally, either in
      • a markdown way ![](Rlogo.png) or
      • a knitr way knitr::include_graphics("Rlogo.png")
    2. figures taken straight from the web
  • Caption for the table
  • Captions text formatting: caption should also allow for text formatting
  • Footnote: include footnotes in the table
  • Table numeration: tables are should be numerated
  • Referencing the table: in the document is needed

Comparison of Approaches

Notes regarding different approaches

  • Fixed cell width: in markdown the number of "-"s in table header determine cell width
  • Linebreaks:
    • LaTex:\linebreak
    • All others: <br/>
  • Referencing
    • LaTex: add label{foo} => ef{foo} ( @ref(foo))
    • Markdown: add Table: (#tab:md-table) Caption==> @ref(tab:md-table))

Comments on different approaches

  • Markdown: easy coding of tables in markdown
  • Kable & kableExtra: Versatile R markdown coding of the table, but vertical text alignment obscure and figures are not included in PDF
  • Pander: achieves the most, but no vertical alignment and footnotes
  • Huxtable: most promising, but figures are not included in PDF
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

This is less an answer than providing MWEs for the table shown above

MWE-screenshot

```{r}
# create some random text
library(stringi)
some_text <- stri_rand_lipsum(1)
some_text <- substr(some_text, 1, 75)

# create dataframe with some stuff
figpath <- "figure/"
df <- data.frame(
  Citation = c("@R-base", "@R-bookdown"),
  Textfield = c("**Formatted** string<br/> -- _Everyone_ needs H^2^O", some_text),
  URL = c("[R-url](https://www.r-project.org/)", "[bookdown](https://bookdown.org/)"),
  fig_local_md = c(
    paste0("![](", figpath, "Rlogo.png){ width=10% height=5% }"),
    paste0("![](", figpath, "bookdownlogo.png){ height='36px' width='36px' }")
  )#,
  # not working:
  # fig_local_knitr = c("knitr::include_graphics('figure/Rlogo.png')", "knitr::include_graphics('figure/bookdownlogo.png')") 
)

# only include if output format is HTML, else pander throws error
if (knitr::is_html_output()) {
  df$fig_web  <- c("![](https://www.picgifs.com/glitter-gifs/a/arrows/picgifs-arrows-110130.gif)")
  output_format <- "html"
}
if (knitr::is_latex_output()) {
  output_format <- "latex"
}
```

markdown

Table: markdown table: markdown styling works in HTML (*italics*, **bold**), LaTex styling in PDF (\textbf{bold})

  | Image                                                      | Description                                                  |
  | :--------------------------------------------------------- | :----------------------------------------------------------- |
  | ![](figure/Rlogo.png){ width=10% height=5% }               | **Image description** [@R-base]  <br/>Lorem ipsum dolor sit amet, ...  [R-url](https://www.r-project.org/) |
  | ![](figure/bookdownlogo.png){ height='36px' width='36px' } | **Image description** [@R-bookdown] <br/>Lorem ipsum dolor sit amet, ... [bookdown](https://bookdown.org/) |

kable table

  ```{r kable-table, echo=FALSE, out.width='90%', fig.align = "center", results='asis'}
library(knitr)
kable(df, 
      caption = "kable table: markdown styling works in HTML (*italics*, **bold**), LaTex styling in PDF (\textbf{bold})", 
      caption.short = "md styling works in HTML (*italics*, **bold**), LaTex styling in PDF (\textbf{bold})"
      )
```

kableExtra table

```{r kableExtra-table, echo=FALSE, out.width='90%', fig.align = "center", results='asis'}
library(kableExtra)
# http://haozhu233.github.io/kableExtra/awesome_table_in_pdf.pdf 
kable(
  df,
  caption = "kableExtra table: markdown styling works in HTML (*italics*, **bold**), LaTex styling in PDF (\textbf{bold})",
  output_format, booktabs = T, # output_format = latex, html (specify above)
  # align = "l", 
  valign = "top"
) %>% 
  kable_styling(full_width = F,
                latex_options = c(#"striped",
                  "hold_position", # stop table floating
                  "repeat_header") # for long tables
  ) %>% 
  column_spec(1, bold = T, border_right = T, width = "30em") %>%
  column_spec(2, width = "50em") %>%
  column_spec(3, width = "5em") %>%
  column_spec(4, width = "10em") %>%
  column_spec(5, width = "10em") %>%
  footnote(general = "Here is a general comments of the table. ",
           number = c("Footnote 1; ", "Footnote 2; "),
           alphabet = c("Footnote A; ", "Footnote B; "),
           symbol = c("Footnote Symbol 1; ", "Footnote Symbol 2"),
           general_title = "General: ", number_title = "Type I: ",
           alphabet_title = "Type II: ", symbol_title = "Type III: ",
           footnote_as_chunk = T, title_format = c("italic", "underline")
  )
```

pander table

```{r pander-table, echo=FALSE, out.width='90%', fig.align = "center", results='asis'}
library(pander)
# https://cran.r-project.org/web/packages/pander/vignettes/pandoc_table.html

pander(
  df,
  caption = "pander table: markdown styling works in HTML and PDF (*italics*, **bold**), LaTex styling in PDF (\textbf{bold})",
  # style = "multiline", # simple
  split.table = Inf, # default = 80 characters; Inf = turn off table splitting
  split.cells = c(15, 50, 5, 5, 5), # default = 30
  # split.cells = c("25%", "50%", "5%", "10%", "10%"), # no difference
  justify = "left"
)
```

huxtable table

```{r huxtable-table, echo=FALSE, out.width='90%', fig.align = "center", results='asis'}
library(dplyr)
library(huxtable)
# https://hughjonesd.github.io/huxtable/
hux <- as_hux(df)                                                       %>%
  # huxtable::add_rownames(colname = '')                                  %>%
  huxtable::add_colnames()                                              %>%
  set_top_border(1, everywhere, 1)                                      %>%
  set_bottom_border(1, everywhere, 1)                                   %>%
  set_bottom_border(final(), everywhere, 1)                             %>%
  set_bold(1, everywhere, TRUE)                                         %>% # bold headlines
  set_italic(-1, 1, TRUE)                                               %>% # italics in first column (except the first row)
  set_valign("top")                                                     %>%
  set_width(1)                                                          %>%
  set_col_width(c(0.10,0.45,0.05,0.10,0.10))                             %>%
  set_wrap(TRUE)                                        %>%
  set_position('left')                                    %>% # fix table alignment (default is center)
  add_footnote("Sample Footnote")                                       %>% 
  set_font_size(4)

table_caption <-  'huxtable table: markdown styling works in HTML (*italics*, **bold**), LaTex styling in PDF (\textbf{bold})'

# Print table conditional on output type
if (knitr::is_html_output()) {
  caption(hux) <- paste0('(#tab:huxtable-table-explicit) ', table_caption)
  print_html(hux) # output table html friendly (requires in chunk options "results='asis'")
}
if (knitr::is_latex_output()) {
  caption(hux) <- paste0('(\#tab:huxtable-table-explicit) ', table_caption)
  hux   # if using chunk option "results='asis'" simply output the table with "hux", i.e. do not use print_latex(hux)
}
```

Referencing the tables

works differently for different table types

Referencing the tables

Adding a short caption for the LoT

Finally adding a short caption for the table of figures is not really working as desired (ref:huxtable-table-caption) huxtable-table caption (ref:huxtable-table-scaption) huxtable-table short caption

```{r huxtable-table, echo=FALSE, out.width='90%', fig.align = "center", fig.cap='(ref:huxtable-table-caption)', fig.scap='(ref:huxtable-table-scaption)', results='asis'}
...
```

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...