Таблицы регрессии в R Markdown / rmarkdown (html/pdf)

Для публикации мне часто нужна версия моей работы в формате PDF и HTML, включая регрессионные таблицы, и я хочу использовать R Markdown. Для PDF stargazer и texreg пакеты производят замечательные столы. Сейчас, пытаясь создать одинаково привлекательный HTML-вывод, я сталкиваюсь с разными проблемами.

  1. Оба метода для вывода HTML не имеют значков звезд в примечаниях. Поскольку они генерируются автоматически, я не знаю, как избежать их. (Я думаю, что это может быть незначительной проблемой, и поэтому я не хотел разбивать ее на отдельные вопросы.) Примечание: здесь был дан ответ на подвопрос.

  2. Перед созданием определенного вывода я часто должен изменить свои данные или сделать некоторое форматирование. Я нахожу это довольно раздражающим, чтобы всегда переключать варианты между type='html' в type='pdf' вручную. Интересно, может ли быть более реальный способ объединить вывод html / pdf, например, переключение между регистрами в texreg / stargazer с аккуратным выходом?

Я попробовал многообещающее pander решение, но, похоже, больше не работает с 2014 года. pixiedust Это не очень удовлетворительно, в конце это становится чем-то ручным, и не совсем то, что я хочу. Другой пример, похоже, ссылается только на обычные таблицы.

Любая помощь очень ценится, спасибо!

Вот краткое изложение моих попыток knitr в HTML и PDF:

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
```{r table, results = "asis"}
library(car)
lm1 <- lm(prestige ~ income + education, data=Duncan)

## html
# stargazer
library(stargazer)
stargazer(lm1, type="html", notes="stargazer html")
# htmlreg
library(texreg)
htmlreg(lm1, custom.note="%stars. htmlreg")

## pdf/latex
# stargazer
stargazer(lm1, notes="stargazer latex")
# texreg
texreg::texreg(list(lm1), custom.note="%stars. texreg")

# pixiedust
library(pixiedust)
dust(lm1, caption = "pixiedust")

# pander
library(memisc)
library(pander)
lm1_table <- mtable(lm1)
# pander(lm1_table, style="rmarkdown") # not working
pander(lm1)
```

1 ответ

Решение

Вот предложение: создайте функцию, которая проверяет выходной формат, а затем использует либо stargazer, либо texreg в зависимости от этого. Мы используем opts_knit$get("rmarkdown.pandoc.to") проверить выходной формат.

---
output: html_document
---

```{r setup, include=FALSE}
library(knitr)
opts_chunk$set(echo = TRUE)
rmd_format <- opts_knit$get("rmarkdown.pandoc.to")
## returns "html" or "latex"

```

```{r}

report_regression <- function(model, format, ...){
  if(format == "html"){
    require(texreg)
    htmlreg(model, custom.note="%stars. htmlreg", ...)
  } else if(format == "latex"){
    require(stargazer)
    stargazer(model, notes="stargazer html", ...)
  } else {
   print("This only works with latex and html output") 
  }
}
```

```{r table, results = "asis"}
library(car)
lm1 <- lm(prestige ~ income + education, data=Duncan)

report_regression(lm1, format = rmd_format)
```

Как указано в ответе на связанный вопрос, knitr 1.18 введены следующие функции

knitr::is_html_output()
knitr::is_latex_output()

чтобы проверить, является ли вывод HTML или LaTeX. Адаптация превосходного ответа @scoa:

---
output: html_document
---

```{r}

report_regression <- function(model, ...){
  if(knitr::is_html_output()){
    require(texreg)
    htmlreg(model, custom.note="%stars. htmlreg", ...)
  } else if(knitr::is_latex_output()){
    require(stargazer)
    stargazer(model, notes="stargazer html", ...)
  } else {
   print("This only works with latex and html output") 
  }
}
```

```{r table, results = "asis"}
library(car)
lm1 <- lm(prestige ~ income + education, data=Duncan)

report_regression(lm1)
```
Другие вопросы по тегам