Programowo tworzenie tabel Markdown w R za pomocą KnitR

Dopiero zaczynam się uczyć o KnitR i wykorzystaniu Markdown w generowaniu dokumentów R i raportów. To wygląda na idealne dla wielu codziennych raportów, które mam do czynienia z moją pracą. Nie widzę jednak łatwego sposobu drukowania ramek danych i tabel przy użyciu formatowania Markdown (coś w stylu xtable, ale z Markdown zamiast LaTeX lub HTML). Wiem, że mogę po prostu osadzić wyjście HTML z xtable, ale zastanawiałem się, czy są jakieś Markdown oparte na rozwiązania?

Author: TARehman, 2013-03-19

7 answers

Teraz knitr (od wersji 1.3) pakiet zawiera funkcję kable do tworzenia tabel:

> 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|

Zaktualizowano: Jeśli masz raw markdown w dokumencie spróbuj setup results = "asis" chunk option.

 110
Author: Artem Klevtsov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-03 19:24:18

Dwa pakiety, które to zrobią to pander

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

Lub ascii

pander jest nieco inne podejście do budowy raportu, (ale może być przydatne dla tej funkcji).

ascii pozwala na print z type = 'pandoc (lub różne inne smaki markdown)

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              
--- ------------------ ----------------- ------------------

Zauważ, że w obu tych przypadkach jest to skierowane do użycia pandoc do konwersji z markdown na żądany typ dokumentu, jednak użycie style='rmarkdown' spowoduje utworzenie tabel, które są kompatybilne z tym pakietem markdown i wbudowaną konwersją w rstudio.

 31
Author: mnel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-11 22:26:51

Chciałem tylko zaktualizować to, co postanowiłem zrobić. Używam teraz pakietu hwriter do drukowania tabel, i używam funkcji row.* i col.* do umieszczania klas CSS na różnych elementach. Następnie napisałem Niestandardowy CSS, aby mój wyświetlacz był taki, jaki chciałem. Oto przykład na wypadek, gdyby ktoś inny miał do czynienia z czymś podobnym.

Najpierw Utwórz plik, który wykona knitting i zmień znacznik na HTML:

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

library(knitr)
library(markdown)

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

Następnie utwórz rzeczywisty Markdown plik:

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"))))
```

Na koniec utwórz własny plik 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;
}

Wykonanie ./file_knit.r daje mi plik.html, który wygląda tak:

Przykładowe Wyjście

Więc, mam nadzieję, że może to być pomocne dla innych, którzy chcą trochę więcej formatowania w wyjściu Markdown!

 25
Author: TARehman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-22 14:20:39

W pakiecie pander znajdują się funkcje:

> 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      
-------------------------------------------
 18
Author: Marius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-18 22:45:27

Nie jest bardzo trudno stworzyć własną, spersonalizowaną funkcję. Oto bardzo prosty dowód koncepcji generowania tabeli rmarkdown 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)
    }

W .Dokument Rmd, który następnie użyjesz funkcji 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))
```

Powyższy kod da ci następujący rysunek (w przykładzie jest to wyjście pdf, ale ponieważ tabela jest w markdwon, możesz również wkleić w html lub word).

Tutaj wpisz opis obrazkaStąd-i czytając Kodeks innych narodów - można dowiedzieć się, jak manipuluj tekstem, aby wygenerować żądaną tabelę i tworzyć bardziej spersonalizowane funkcje.

 12
Author: Carlos Cinelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-22 21:57:53

Użyj kombinacji knitr:: kable i xtable w dokumencie markdown.

library("knitr","xtable")

Dla prostych danych.frame -

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

format="pandoc" umożliwia więcej opcji, takich jak podpis.

Teraz kombinacja dla podsumowania modelu.

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

Aby uzyskać jeszcze więcej opcji, spójrz na stargazer Pakiet zamiast xtable.

Przykład do użytku osobistego

 3
Author: Pankil Shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-04 00:03:07

Aby pisać / tworzyć tabele Markdown w R, Możesz również użyć MarkdownReports' MarkDown_Table_writer_DF_RowColNames() LUB MarkDown_Table_writer_NamedVector() funkcji. Po prostu przekazujesz ramkę danych / macierz z nazwami wymiarów lub wektor z nazwami, a ona przetwarza i zapisuje tabelę w formacie Markdown.

 1
Author: bud.dugong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-28 14:51:38