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