как включить ‘column_spec’ в вывод datasummary?

#r #kable #kableextra #modelsummary

Вопрос:

Я запускаю следующий код в R:

 library(modelsummary)
library(kableExtra)

tmp <- mtcars[, c("mpg", "hp")]

# create a list with individual variables
# remove missing and rescale
tmp_list <- lapply(tmp, na.omit)
tmp_list <- lapply(tmp_list, scale)

# create a table with `datasummary`
# add a histogram with column_spec and spec_hist
# add a boxplot with colun_spec and spec_box
emptycol = function(x) " "
datasummary(mpg   hp ~ Mean   SD   Heading("Boxplot") * emptycol   Heading("Histogram") * emptycol, data = tmp, output='latex') %>%
  column_spec(column = 4, image = spec_boxplot(tmp_list)) %>%
  column_spec(column = 5, image = spec_hist(tmp_list))
 

Источник:
https://vincentarelbundock.github.io/modelsummary/articles/datasummary.html#histograms-1

что дает мне следующую таблицу в R: введите описание изображения здесь

Указав output=’latex’, мы получаем код LaTeX для создания таблицы в LaTeX:

 documentclass[a4,11pt]{article}

usepackage{graphicx}
usepackage{booktabs}
usepackage{siunitx}
newcolumntype{d}{S[input-symbols = ()]}

begin{document}

begin{table}
centering
begin{tabular}[t]{lrr>{}r>{}r}
toprule
  amp; Mean amp; SD amp; Boxplot amp; Histogram\
midrule
mpg amp; num{20.09} amp; num{6.03} amp; includegraphics[width=0.67in, height=0.17in]{} amp; includegraphics[width=0.67in, height=0.17in]{}\
hp amp; num{146.69} amp; num{68.56} amp; includegraphics[width=0.67in, height=0.17in]{} amp; includegraphics[width=0.67in, height=0.17in]{}\
bottomrule
end{tabular}
end{table}

end{document}
 

Однако при запуске этого кода я получаю ошибку в TeX, потому что отсутствует такая информация, как includegraphics[width=0.67in, height=0.17in]{MISSING}

Я думаю, что это может быть связано с тем, что мы запрашиваем вывод перед этим фрагментом кода:

   %>%
  column_spec(column = 4, image = spec_boxplot(tmp_list)) %>%
  column_spec(column = 5, image = spec_hist(tmp_list))
 

Есть ли способ включить этот фрагмент кода в основной массив данных?

Редактировать:

Когда я пытаюсь экспортировать таблицу в формате pdf с помощью R Markdown в соответствии с приведенным ниже примером кода:

 ---
title: "table1"
output: pdf_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```


## R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see <http://rmarkdown.rstudio.com>.

When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

```{r cars}
summary(cars)
```

## Including Plots

You can also embed plots, for example:

```{r pressure, echo=FALSE}
plot(pressure)
```

Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.

```{r prep-tableone, message=FALSE, fig.pos="H"}

tmp <- mtcars[, c("mpg", "hp")]

# create a list with individual variables
# remove missing and rescale
tmp_list <- lapply(tmp, na.omit)
tmp_list <- lapply(tmp_list, scale)

# watch out that order of variables here must match exactly the one in the list above
emptycol = function(x) " "
table_output <- datasummary(mpg   hp ~ Min   Max   Mean   Heading("Boxplot") * emptycol   Heading("Histogram") * emptycol, data = tmp) %>%
  column_spec(column = 5, image = spec_boxplot(tmp_list)) %>%
  column_spec(column = 6, image = spec_hist(tmp_list))

```

```{r tableone}
table_output

```
 

После нажатия на кнопку «вязать» я получаю следующее сообщение об ошибке:
введите описание изображения здесь

Есть какие-нибудь идеи о том, что здесь может происходить?

Ответ №1:

Я считаю, что это ограничение в kableExtra пакете, а не в modelsummary пакете, как указано здесь. (Обратите внимание, что modelsummary на самом деле таблицы не рисуются сами по себе, а скорее поддерживают внешние пакеты для этого— kableExtra , gt , flextable , huxtable ).

Прямо сейчас kableExtra таблицы со встроенными гистограммами или прямоугольными диаграммами работают только в готовом виде для вывода в формате HTML или в PDF-документах, созданных Rmarkdown. Возможно, есть способ сохранить мини-графики в формате .SVG для последующего использования в отдельном документе LaTeX. Я предполагаю, что это будет довольно сложно, но вы, возможно, захотите прочитать подсказки по ссылке на Github, размещенной выше.

Вот минимальный пример, который воспроизводит вашу проблему с помощью простой kableExtra таблицы (еще раз обратите внимание, что modelsummary она не задействована).:

 library(kableExtra)
dat_hist = list(rnorm(100), rnorm(100))
data.frame(num = 1:2, plt = c("", "")) |>
    kbl(format = "latex") |>
    column_spec(column = 2, image = spec_hist(dat_hist)) |>
    cat()
# 
# begin{tabular}[t]{r|>{}l}
# hline
# num amp; plt\
# hline
# 1 amp; includegraphics[width=0.67in, height=0.17in]{}\
# hline
# 2 amp; includegraphics[width=0.67in, height=0.17in]{}\
# hline
# end{tabular}
 

Возможно, вы захотите отправить запрос на функцию kableExtra в репозиторий github, используя минимальный пример.

Комментарии:

1. Спасибо, Винсент! Это имеет смысл, я только что поднял вопрос об этом на GitHub. Тем временем я следую вашему совету и пытаюсь экспортировать эту таблицу с графиками и гистограммами с помощью R Markdown. Однако, когда я нажимаю «вязать», я получаю ошибку выше. Я отредактировал свой вопрос, чтобы включить этот сценарий — пожалуйста, смотрите после «Редактировать». Не могли бы вы заметить мою ошибку? Большое спасибо!

2. Эта %>% функция не является базовой функцией R. Вам необходимо загрузить библиотеку, предоставляющую эту функцию, например tidyverse , magrittr , или kableExtra . Конечно, вам также нужно будет загрузить modelsummary пакет.

3. Я думал, что пакеты уже загружены через консоль.. моя ошибка! Спасибо, что указали на это. Это сработало! Теперь я, наконец, могу попытаться создать свою собственную таблицу как с факторными, так и с числовыми переменными. Я только что задал вопрос по этому поводу, если у вас есть немного времени, чтобы помочь! Заранее спасибо