Програмно створення таблиць 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" або "Pandoc". 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
під час роботи всередині в'язального пристрою, ви можете опустити formatаргумент, оскільки Knr знає вихідний формат і автоматично його встановить
— Yihui Xie

3
@Yihui Ви дивовижні
— ізоморфізм

2
Я спробував це, але `` {r} kable (...) просто показує необмежену відмітку
— Алекс Браун

6
Спробуйте встановити параметр для місцевого шматка results = asis.
— Артем Клевцов

5
FYI knitr тепер вимагає команду у форматіresults = 'asis'
— Stedy

32

Два пакети, які зроблять це, - це Pander

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: воно може створювати rmarkdownpander(head(iris[,1:3]), style = 'rmarkdown')
— стильові

@daroczig - Дякую та зазначив у відповіді зараз,
— Менель

26

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

Спочатку створіть файл, який буде виконувати knittingта змінити розмітку на 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дає мені файл.html, який виглядає приблизно так:

Приклад Вихід

Отож, сподіваємось, це може бути корисним для інших, хто хоче трохи більше форматування у висновку Markdown!


1
Так, ні. Буде працювати з Markdown -> HTML, але не з Markdown -> PDF, Markdown -> DOCX ... Питання про використання Markdown взагалі не тільки для створення HTML-файлів з ним - можливо, це було вашим намір, але там не записано.
— petermeissner

Ви помітили, що я відповідаю на власне запитання? Я можу відредагувати питання або позначити його по-іншому, якщо ви вважаєте, що це допоможе?
— TARehman

До речі, під час цієї відповіді в'язальниця підтримувала лише HTML. Тому питання чітко нічого не говорить про HTML.
— TARehman

перемикання, зміна питання допоможе ... але навіщо робити його більш конкретним, коли він корисніший для всіх, коли він ширший і загальніший? Що стосується того, що ви відповідаєте на власне запитання, добре, що інші надають таблиці у форматі Markdown, ви надаєте таблиці у форматі HTML - це не є неправильним, але я вважаю, що інші відповіді просто до речі, елегантні та корисніші. не всім подобається ваша відповідь, чи не достатньо, що вам сподобалась ваша відповідь?
— petermeissner

7
Ви самі сказали, що моя відповідь не є помилковою, але інші краще. Правильне застосування системи голосування полягає в тому, щоб заохочувати кращі відповіді, а не знижувати мої. Дивіться також тут: stackoverflow.com/help/privileges/vote-down «Використовуйте downvotes щоразу , коли ви зіткнулися з кричущим неакуратно, що не-зусиль, витрачається пост або відповідь , який явно і , можливо , небезпечно неправильно.»
— ТАРехман,

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

Зробити власну індивідуальну функцію не дуже важко. Ось дуже простий доказ концепції створення таблиці обмеження 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 чи слово).

введіть тут опис зображення Звідси - і читаючи код інших людей - ви можете зрозуміти, як керувати текстом, щоб створити потрібну таблицю та створити більш персоналізовані функції.


1
це чудово, але чи знаєте ви, як зробити це вирівнювання ліворуч, а не по центру?
— Патрік

3

використовуйте комбінацію в'язання :: 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.