Программное создание таблиц 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.


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.


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 | 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.