KnitR ile R'de programlı olarak Markdown tabloları oluşturma


103

KnitR ve Markdown'un R belgeleri ve raporları oluştururken kullanımı hakkında yeni bilgi edinmeye başlıyorum. Bu, işimle yapmam gereken birçok günlük rapor için mükemmel görünüyor. Bununla birlikte, görmediğim bir şey, veri çerçevelerini ve tablolarını Markdown biçimlendirmesini kullanarak yazdırmanın kolay bir yolu (bir çeşit benzer xtable, ancak LaTeX veya HTML yerine Markdown ile). HTML çıktısını xtable'dan gömebileceğimi biliyorum, ancak Markdown tabanlı çözümler olup olmadığını merak ediyordum.


3
Xtable ve html düşünüldüğünde .. html kodunu ile yazdırın print(xtable(data), type = "html").
user974514

7
@TARehman Sorunuz bana hala doğrudan uyumlu tablolar üreten bir çözüm olmadığını hatırlattı knitr, bu yüzden pandertablo stilini eklemek için bir çekme isteği gönderdim . Uygulamasının gelecekteki sürümlerinde panderşunları yapabilmelisinizpandoc.table(iris, style="rmarkdown")
Marius

1
@Marius Pandoc'un neden CRAN'ın bir parçası olmadığını biliyor musunuz? Ya da ne zaman bunun bir parçası olabilir? Sadece merak.
TARehman

2
@TARehman Pander mı yoksa pandoc mu demek istediğinizden tam olarak emin değilim. panderCRAN üzerinde olmalıdır. Pandoc, Haskell'de yazılmış, çok çeşitli farklı biçimlerden dönüştüren bir programdır, hiçbir şekilde R'ye özgü değildir.
Marius

1
Özür dilerim, demek istediğim pander, son kez CRAN'da yoktu - hayır pandoc. Benim hatam. :)
TARehman

Yanıtlar:


122

Şimdi knitr(sürüm 1.3'ten beri) paket, kableoluşturma tablolarının işlevini içerir :

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

GÜNCELLENDİ : Bir belgede ham fiyat indirimi alırsanız kurulum results = "asis"öbek seçeneğini deneyin .


24
knitr içinde çalışırken formatargümanı dışarıda bırakabilirsiniz çünkü knitr çıktı formatının farkındadır ve onu otomatik olarak ayarlayacaktır
Yihui Xie

3
@Yihui You are amazing
isomorphismes

2
Bunu denedim, ancak “{r} kable (...) sadece ham fiyat düşüşünü gösteriyor
Alex Brown

6
Yerel yığın seçeneğini olarak ayarlamayı deneyin results = asis.
Artem Klevtsov

5
FYI knitr artık şu formatta komut gerektiriyorresults = 'asis'
Stedy

32

Bunu yapacak iki paket pandadır

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

Veya ascii

pander yapıyı bildirmek için biraz farklı bir yaklaşımdır (ancak bu özellik için yararlı olabilir).

asciisizi sağlayacak printolan type = 'pandoc(ya da diğer çeşitli markdown tatlar)

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

Her iki durumda da, pandocmarkdown'dan istediğiniz belge türüne dönüştürmek için kullanmaya yönelik olduğunu unutmayın, ancak kullanım style='rmarkdown', bu markdownpaket ve içinde yerleşik dönüştürme ile uyumlu tablolar oluşturacaktır rstudio.


3
panderrmarkdownpander(head(iris[,1:3]), style = 'rmarkdown')
Şunun

@daroczig - Teşekkürler ve cevapta şimdi not edildi,
mnel

26

Bunu yapmaya karar verdiğim şeyle güncellemek istedim. Ben kullanıyorum hwritertabloları yazdırmak için şu anda paketini ve kullanma row.*ve col.*farklı unsurlara CSS sınıfları koymak özellikleri. Ardından, ekranımı istediğim gibi yapmak için özel CSS yazdım. İşte başka birinin benzer bir şeyle uğraşması durumunda bir örnek.

İlk olarak, knittingMarkdown'ı yapacak ve HTML'ye dönüştürecek bir dosya oluşturun :

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

library(knitr)
library(markdown)

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

Ardından, gerçek Markdown dosyasını oluşturun:

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

Son olarak, özel bir CSS dosyası oluşturun.

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

Yürütme ./file_knit.rbana file.html veriyor, bu da şuna benziyor:

Örnek Çıktı

Yani, umarım bu, Markdown çıktısında biraz daha biçimlendirme isteyenlere yardımcı olabilir!


1
Evet, hayır. Markdown -> HTML ile çalışacak, ancak Markdown -> PDF, Markdown -> DOCX ile çalışmayacak ... Soru, Markdown'u genel olarak yalnızca HTML dosyaları oluşturmak amacıyla kullanmakla ilgili değil - sizin niyet, ama orada yazılı değil.
petermeissner

Kendi sorumu cevapladığımı fark ettin mi? Yardımcı olacağını düşünüyorsanız soruyu düzenleyebilir veya farklı şekilde etiketleyebilir miyim?
TARehman

Bu arada, bu cevabın verildiği sırada knitr yalnızca HTML'yi destekliyordu. Bu yüzden soru HTML hakkında açıkça hiçbir şey söylemiyor.
TARehman

jip, soruyu değiştirmek yardımcı olacaktır ... ama daha geniş ve daha genel olduğunda, herkes için daha kullanışlıyken neden daha spesifik hale getirmek? Kendi sorunuzu yanıtlamanızla ilgili olarak, diğerleri Markdown formatında tablolar sağlar, siz HTML formatında tablolar sağlar - bu yanlış değil, ancak diğer cevapları basitçe, zarif ve daha yararlı buluyorum. cevabınızı herkesin beğenmesi gerekmiyor, cevabınızı beğenmeniz yeterli değil mi?
petermeissner

7
Cevabımın yanlış olmadığını ama başkalarının daha iyi olduğunu siz kendiniz söylediniz. Oylama sisteminin doğru uygulaması, benimkine olumsuz oy vermek değil, daha iyi yanıtları yükseltmektir. Ayrıca şuraya da bakın: stackoverflow.com/help/privileges/vote-down "Aşırı derecede baştan savma, çaba harcanmamış bir gönderi veya açık ve belki de tehlikeli şekilde yanlış bir yanıtla karşılaştığınızda olumsuz oylarınızı kullanın."
TARehman

18

panderPakette işlevler var :

> 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
Tanıtımınız için teşekkürler pander:) Lütfen yazmak için birkaç karakter kaydetmek için genel S3 yöntemini de kullanabileceğinizi unutmayın, örneğin:pander(head(iris)[, 1:3])
daroczig

12

Kendi özel işlevinizi yapmak çok zor değil. Aşağıda, a'nın geri sayım tablosunu oluşturmak için çok basit bir kavram kanıtı verilmiştir 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 belgesinde daha sonra işlevi şu şekilde kullanırsınız 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))
```

Yukarıdaki kod size aşağıdaki şekli verecektir (örnekte bu pdf çıktısıdır, ancak tablo markdwon'da olduğu için html veya kelimeyi de örebilirsiniz).

görüntü açıklamasını buraya girin Buradan - ve diğer kişilerin kodunu okuyarak - istediğiniz tabloyu ve daha kişiselleştirilmiş işlevler oluşturmak için metni nasıl değiştireceğinizi öğrenebilirsiniz.


1
bu harika, ama bunu ortalamak yerine sol tarafa nasıl hizalayacağınızı biliyor musunuz?
Patrick

3

markdown belgenizde knitr :: kable ve xtable kombinasyonunu kullanın.

library("knitr","xtable")

basit bir data.frame için -

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

format="pandoc" resim yazısı gibi daha fazla seçeneğe izin verir.

Şimdi model özeti kombinasyonu .

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

daha fazla seçenek için stargazeryerine pakete bakın xtable.

kişisel kullanım için örnek


1

R'de Markdown tabloları yazmak / oluşturmak için MarkdownReports ' MarkDown_Table_writer_DF_RowColNames() veya MarkDown_Table_writer_NamedVector()işlevlerini de kullanabilirsiniz . Sadece boyut adları olan bir veri çerçevesi / matrisi veya isimleri olan bir vektör aktarırsınız ve tabloyu Markdown formatında ayrıştırır ve yazar.


0

Gitlab için işlevim:

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 | 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.