Программное создание таблиц Markdown в R с KnitR

103

Я только начинаю узнавать о KnitR и использовании Markdown для создания документов и отчетов R. Похоже, это идеально подходит для повседневных отчетов о том, что я имею отношение к своей работе. Однако я не вижу одного простого способа печати фреймов данных и таблиц с использованием форматирования Markdown (вроде как xtable, но с Markdown вместо LaTeX или HTML). Я знаю, что могу просто встроить HTML-вывод из xtable, но мне было интересно, есть ли какие-нибудь решения на основе Markdown?

Т.А.Рехман
источник
3
Учитывая xtable и html .. Распечатайте html-код с помощью print(xtable(data), type = "html").
user974514
7
@TARehman Ваш вопрос напомнил мне, что до сих пор не существовало решения, которое создавало бы таблицы, непосредственно совместимые с ним knitr, поэтому я отправил запрос на перенос, panderчтобы добавить стиль таблицы. В будущих версиях panderвы сможете это сделатьpandoc.table(iris, style="rmarkdown")
Мариус
1
@Marius Вы случайно не знаете, почему pandoc не является частью CRAN? Или когда это может стать его частью? Просто любопытно.
TARehman
2
@TARehman Я не совсем уверен, имели ли вы в виду сводничество или пандок. panderдолжен быть на CRAN. pandoc - это программа, написанная на Haskell, которая преобразует множество различных форматов и обратно, ни в коем случае не специфична для R.
Мариус
1
Извините, я имел в виду pander, что не было на CRAN в прошлый раз, когда я слышал - нет pandoc. Моя вина. :)
TARehman

Ответы:

122

Теперь knitr(начиная с версии 1.3) в пакет включена kableфункция создания таблиц:

> library(knitr)
> kable(head(iris[,1:3]), format = "markdown")
|  Sepal.Length|  Sepal.Width|  Petal.Length|
|-------------:|------------:|-------------:|
|           5,1|          3,5|           1,4|
|           4,9|          3,0|           1,4|
|           4,7|          3,2|           1,3|
|           4,6|          3,1|           1,5|
|           5,0|          3,6|           1,4|
|           5,4|          3,9|           1,7|

ОБНОВЛЕНО : если вы получаете необработанную уценку в документе, попробуйте настроить results = "asis"параметр чанка.

Артем Клевцов
источник
24
при запуске внутри knitr вы можете опустить formatаргумент, поскольку knitr знает формат вывода и автоматически устанавливает его
Yihui Xie
3
@Yihui Ты потрясающий
isomorphismes
2
Я пробовал это, но `` {r} kable (...) просто показывает необработанную уценку
Алекс Браун,
6
Попробуйте установить для параметра локального фрагмента значение results = asis.
Артем Клевцов
5
FYI knitr теперь требует команду в форматеresults = 'asis'
Stedy
32

Два пакета, которые сделают это, - это потворство.

library(devtools)
install_github('pander', 'Rapporter')

Или ascii

pander - это немного другой подход к построению отчетов (но может быть полезен для этой функции).

asciiпозволит вам printс type = 'pandoc(или различные другие уценки ароматы)

library(ascii)
print(ascii(head(iris[,1:3])), type = 'pandoc')



    **Sepal.Length**   **Sepal.Width**   **Petal.Length**  
--- ------------------ ----------------- ------------------
1   5.10               3.50              1.40              
2   4.90               3.00              1.40              
3   4.70               3.20              1.30              
4   4.60               3.10              1.50              
5   5.00               3.60              1.40              
6   5.40               3.90              1.70              
--- ------------------ ----------------- ------------------

Обратите внимание, что в обоих этих случаях он направлен на использование pandocпреобразования из уценки в желаемый тип документа, однако использование style='rmarkdown'приведет к созданию таблиц, совместимых с этим markdownпакетом, и встроенного преобразования в rstudio.

Mnel
источник
3
Просто примечание pander: он может создавать rmarkdownстилизованные таблицы также рядом с другими, например:pander(head(iris[,1:3]), style = 'rmarkdown')
daroczig
@daroczig - Спасибо и отметили в ответе сейчас,
mnel
26

Просто хотел обновить это тем, что я решил делать. Я использую hwriterпакет прямо сейчас для распечатки таблиц и использую функции row.*и col.*для размещения классов CSS в различных элементах. Затем я написал собственный CSS, чтобы изображение отображалось так, как я хотел. Итак, вот пример на случай, если кто-то еще имеет дело с чем-то похожим.

Сначала создайте файл, который сделает knittingи изменит Markdown на HTML:

FILE: file_knit.r
#!/usr/bin/env Rscript

library(knitr)
library(markdown)

knit("file.Rmd")
markdownToHTML("file.md","file.html",stylesheet="~/custom.css")

Затем создайте фактический файл Markdown:

FILE: file.Rmd
Report of Fruit vs. Animal Choices
==================================

This is a report of fruit vs. animal choices.

```{r echo=FALSE,results='asis'}
library(hwriter)
set.seed(9850104)
my.df <- data.frame(Var1=sample(x=c("Apple","Orange","Banana"),size=40,replace=TRUE),
                    Var2=sample(x=c("Dog","Cat","Bunny"),size=40,replace=TRUE))

tbl1 <- table(my.df$Var1,my.df$Var2)

tbl1 <- cbind(tbl1,rowSums(tbl1))
tbl1 <- rbind(tbl1,colSums(tbl1))

colnames(tbl1)[4] <- "TOTAL"
rownames(tbl1)[4] <- "TOTAL"

# Because I used results='asis' for this chunk, I can just use cat() and hwrite() to 
# write out the table in HTML. Using hwrite()'s row.* function, I can assign classes
# to the various table elements.
cat(hwrite(tbl1,
           border=NA,
           table.class="t1",
           row.class=list(c("header col_first","header col","header col","header col", "header col_last"),
                          c("col_first","col","col","col","col_last"),
                          c("col_first","col","col","col","col_last"),
                          c("col_first","col","col","col","col_last"),
                          c("footer col_first","footer col","footer col","footer col","footer col_last"))))
```

Наконец, просто создайте собственный файл CSS.

FILE: custom.css
body {
  font-family: sans-serif;
  background-color: white;
  font-size: 12px;
  margin: 20px;
}

h1 {font-size:1.5em;}

table {
  border: solid;
  border-color: black;
  border-width: 2px;
  border-collapse: collapse;
  margin-bottom: 20px;
  text-align: center;
  padding: 0px;
}

.t1 .header {
  color: white;
  background-color: black;
  border-bottom: solid;
  border-color: black;
  border-width: 2px;
  font-weight: bold;
}

.t1 .footer {
  border-top: solid;
  border-color: black;
  border-width: 2px;
}

.t1 .col_first {
  border-right: solid;
  border-color: black;
  border-width: 2px;
  text-align: left;
  font-weight: bold;
  width: 75px;
}

.t1 .col {
  width: 50px;
}

.t1 .col_last {
  width: 50px;
  border-left: solid;
  border-color: black;
  border-width: 2px;
}

Выполнение ./file_knit.rдает мне file.html, который выглядит так:

Пример вывода

Итак, надеюсь, это может быть полезно для тех, кто хочет немного больше форматирования в выводе Markdown!

Т.А.Рехман
источник
1
Да нет. Будет работать с Markdown -> HTML, но не с Markdown -> PDF, Markdown -> DOCX ... Вопрос в том, чтобы использовать Markdown в целом не только для создания файлов HTML с ним - возможно, это было вашим намерение, но не записано там.
petermeissner
Вы заметили, что я отвечаю на свой вопрос? Я могу отредактировать вопрос или пометить его по-другому, если вы думаете, что это поможет?
Т.А. Рехман
Кстати, во время этого ответа knitr поддерживал только HTML. Вот почему вопрос ничего не говорит об HTML.
Т.А. Рехман
jip, изменение вопроса могло бы помочь ... но зачем делать его более конкретным, если он более полезен для всех, когда он более широкий и общий? Что касается того, что вы отвечаете на свой вопрос, то другие предоставляют таблицы в формате Markdown, вы предоставляете таблицы в формате HTML - это не неправильно, но я считаю, что другие ответы просто по существу, элегантны и более полезны. Не всем должен нравиться ваш ответ, разве недостаточно того, что понравился ваш ответ?
petermeissner
7
Вы сами сказали, что мой ответ не неправильный, но что другие лучше. Правильное применение системы голосования - голосовать за лучший ответ, а не за мой. См. Также здесь: stackoverflow.com/help/privileges/vote-down «Используйте свои отрицательные голоса всякий раз, когда вы сталкиваетесь с вопиюще небрежным постом, не требующим усилий, или с ответом, который является явно и, возможно, опасно неверным».
Т.А. Рехман
18

В panderпакете есть функции :

> library(pander)
> pandoc.table(head(iris)[, 1:3])

-------------------------------------------
 Sepal.Length   Sepal.Width   Petal.Length 
-------------- ------------- --------------
     5.1            3.5           1.4      

     4.9             3            1.4      

     4.7            3.2           1.3      

     4.6            3.1           1.5      

      5             3.6           1.4      

     5.4            3.9           1.7      
-------------------------------------------
Мариус
источник
4
Спасибо за продвижение pander:) Обратите внимание, что вы также можете использовать общий метод S3, чтобы сохранить несколько символов для ввода, например:pander(head(iris)[, 1:3])
daroczig
12

Сделать собственную индивидуальную функцию несложно. Вот очень простое доказательство концепции создания таблицы rmarkdown для a data.frame:

   rmarkdownTable <- function(df){
      cat(paste(names(df), collapse = "|"))
      cat("\n")
      cat(paste(rep("-", ncol(df)), collapse = "|"))
      cat("\n")

      for(i in 1:nrow(df)){
        cat(paste(df[i,], collapse = "|"))
        cat("\n")
        }
    invisible(NULL)
    }

В документе .Rmd вы затем использовали бы функцию с results = 'asis':

```{r, results = 'asis'}
rmarkdownTable <- function(df){
  cat(paste(names(df), collapse = "|"))
  cat("\n")
  cat(paste(rep("-", ncol(df)), collapse = "|"))
  cat("\n")

  for(i in 1:nrow(df)){
    cat(paste(df[i,], collapse = "|"))
    cat("\n")
    }
invisible(NULL)
}

rmarkdownTable(head(iris))
```

Приведенный выше код даст вам следующий рисунок (в примере это выходной файл pdf, но, поскольку таблица находится в markdwon, вы также можете связать его в html или word).

введите описание изображения здесь Отсюда - и читая код других людей - вы можете понять, как манипулировать текстом, чтобы сгенерировать нужную вам таблицу и создать более персонализированные функции.

Карлос Чинелли
источник
1
это здорово, но знаете ли вы, как выровнять это по левой стороне, а не по центру?
Патрик
3

используйте комбинацию knitr :: kable и xtable в своем документе уценки.

library("knitr","xtable")

для простого data.frame -

kable(head(mtcars[,1:4]),format="markdown")
kable(head(mtcars[,1:4]),format="pandoc",caption="Title of the table")

format="pandoc" позволяет больше параметров, например заголовок.

Теперь комбинация для описания модели .

data(tli)
fm1 <- aov(tlimth ~ sex + ethnicty + grade + disadvg, data=tli)
kable(xtable(fm1), caption = "Annova table")

для получения дополнительных опций посмотрите на stargazerпакет вместо xtable.

пример для личного пользования

Панкил Шах
источник
1

Чтобы писать / создавать таблицы Markdown в R, вы также можете использовать MarkdownReports MarkDown_Table_writer_DF_RowColNames() или MarkDown_Table_writer_NamedVector()функции. Вы просто передаете фрейм данных / матрицу с именами измерений или вектор с именами, и он анализирует и записывает таблицу в формате Markdown.

bud.dugong
источник
0

Моя функция для Gitlab:

to_markdown<-function(df) {
    wrap<-function(x,sep=" ") paste0("|", sep, paste(x, collapse=paste0(sep,"|",sep)), sep, "|", sep=sep)
    paste0(wrap(colnames(df)),
    "\n",
    wrap(rep("------", ncol(df)),sep=""),
    "\n",
    paste(apply(df, 1, wrap), collapse="\n"))
}

cat(to_markdown(head(iris[,1:3])))
| Sepal.Length | Sepal.Width | Petal.Length | 
|------|------|------|
| 5.1 | 3.5 | 1.4 | 
| 4.9 | 3 | 1.4 | 
| 4.7 | 3.2 | 1.3 | 
| 4.6 | 3.1 | 1.5 | 
| 5 | 3.6 | 1.4 | 
| 5.4 | 3.9 | 1.7 | 
Валентас
источник