#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. Я думал, что пакеты уже загружены через консоль.. моя ошибка! Спасибо, что указали на это. Это сработало! Теперь я, наконец, могу попытаться создать свою собственную таблицу как с факторными, так и с числовыми переменными. Я только что задал вопрос по этому поводу, если у вас есть немного времени, чтобы помочь! Заранее спасибо