Secara terprogram membuat tabel Markdown di R dengan KnitR

103

Saya baru mulai belajar tentang KnitR dan penggunaan penurunan harga dalam menghasilkan dokumen dan laporan R. Tampaknya ini sempurna untuk banyak laporan harian yang harus saya lakukan dengan pekerjaan saya. Namun, satu hal yang tidak saya lihat adalah cara mudah untuk mencetak bingkai data dan tabel menggunakan pemformatan penurunan harga (semacamnya xtable, tetapi dengan penurunan harga alih-alih LaTeX atau HTML). Saya tahu bahwa saya bisa menyematkan output HTML dari xtable, tetapi saya bertanya-tanya apakah ada solusi berbasis penurunan harga?

TARehman
sumber
3
Mempertimbangkan xtable dan html .. Cetak kode html dengan print(xtable(data), type = "html").
pengguna974514
7
@TARehman Pertanyaan Anda mengingatkan saya bahwa masih belum ada solusi yang menghasilkan tabel yang kompatibel secara langsung knitr, jadi saya mengirim permintaan tarik panderuntuk menambahkan gaya tabel. Dalam versi masa depan pander, Anda harus dapat melakukannyapandoc.table(iris, style="rmarkdown")
Marius
1
@Marius Apakah Anda kebetulan tahu mengapa pandoc bukan bagian dari CRAN? Atau kapan bisa menjadi bagian darinya? Hanya penasaran.
TARehman
2
@TARehman Saya tidak begitu yakin apakah yang Anda maksud calo atau pandoc. panderharus di CRAN. pandoc adalah program yang ditulis di Haskell yang mengonversi ke dan dari berbagai format berbeda, program ini tidak spesifik untuk R dengan cara apa pun.
Marius
1
Maaf, maksud saya pander, yang tidak ada di CRAN terakhir kali saya dengar - tidak pandoc. Salahku. :)
TARehman

Jawaban:

122

Sekarang knitr(sejak versi 1.3) paket menyertakan kablefungsi untuk tabel pembuatan:

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

DIPERBARUI : jika Anda mendapatkan penurunan harga mentah dalam dokumen, coba results = "asis"opsi potongan pengaturan .

Artem Klevtsov
sumber
24
saat menjalankan di dalam knitr, Anda dapat mengabaikan formatargumennya, karena knitr mengetahui format keluaran dan akan secara otomatis mengaturnya
Yihui Xie
3
@Yihui Kamu luar biasa
isomorfisme
2
Saya mencoba ini, tetapi `` {r} kable (...) hanya menunjukkan penurunan harga mentah
Alex Brown
6
Cobalah untuk mengatur opsi potongan lokal ke results = asis.
Artem Klevtsov
5
FYI knitr sekarang membutuhkan perintah dalam formatresults = 'asis'
Stedy
32

Dua paket yang akan melakukan ini adalah calo

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

Atau ascii

pander adalah pendekatan yang sedikit berbeda untuk konstruksi laporan, (tetapi dapat berguna untuk fitur ini).

asciiakan memungkinkan Anda untuk printdengan type = 'pandoc(atau berbagai rasa penurunan harga lainnya)

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

Perhatikan bahwa dalam kedua kasus ini, ini diarahkan ke penggunaan pandocuntuk mengkonversi dari penurunan harga ke jenis dokumen yang Anda inginkan, namun menggunakan style='rmarkdown'akan membuat tabel yang kompatibel dengan markdownpaket ini dan konversi bawaan rstudio.

mnel
sumber
3
Sekadar catatan tentang pander: ini dapat menghasilkan rmarkdowntabel bergaya juga di samping yang lain, misalnya:pander(head(iris[,1:3]), style = 'rmarkdown')
daroczig
@daroczig - Terima kasih dan catat dalam jawabannya sekarang,
mnel
26

Hanya ingin memperbarui ini dengan apa yang saya putuskan untuk lakukan. Saya menggunakan hwriterpaket sekarang untuk mencetak tabel, dan menggunakan row.*dan col.*fitur untuk menempatkan kelas CSS ke elemen yang berbeda. Kemudian, saya menulis CSS khusus untuk membuat tampilan saya seperti yang saya inginkan. Jadi, inilah contoh jika ada orang lain yang berurusan dengan hal serupa.

Pertama buat file yang akan di lakukan knittingdan ubah Markdown menjadi HTML:

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

library(knitr)
library(markdown)

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

Selanjutnya, buat file Markdown yang sebenarnya:

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

Terakhir, buat saja file CSS khusus.

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

Pelaksana ./file_knit.rmemberi saya file.html, yang terlihat seperti ini:

Contoh Output

Jadi, semoga ini dapat membantu orang lain yang menginginkan lebih banyak pemformatan dalam output Markdown!

TARehman
sumber
1
Ya tidak Akan bekerja dengan Markdown -> HTML tetapi tidak dengan Markdown -> PDF, Markdown -> DOCX ... Pertanyaannya adalah tentang menggunakan Markdown secara umum tidak hanya untuk tujuan membuat file HTML dengannya - mungkin saja Anda niat, tetapi tidak tertulis di sana.
petermeissner
Apakah Anda memperhatikan saya menjawab pertanyaan saya sendiri? Saya dapat mengedit pertanyaan atau menandainya secara berbeda jika menurut Anda itu akan membantu?
TARehman
Kebetulan, pada saat jawaban ini dibuat, knitr hanya mendukung HTML. Itulah mengapa pertanyaan tersebut tidak secara eksplisit mengatakan apa pun tentang HTML.
TARehman
jip, mengubah pertanyaan akan membantu ... tetapi mengapa membuatnya lebih spesifik ketika lebih berguna untuk semua ketika itu lebih luas dan lebih umum? Berkenaan dengan Anda menjawab pertanyaan Anda sendiri, baik yang lain menyediakan tabel dalam format penurunan harga Anda memberikan tabel dalam format HTML - tidak salah tetapi saya menemukan jawaban lain langsung ke intinya, elegan dan lebih membantu. tidak semua orang pasti menyukai jawaban Anda, bukankah cukup menyukai jawaban Anda?
petermeissner
7
Anda sendiri mengatakan bahwa jawaban saya tidak salah, tetapi orang lain lebih baik. Penerapan yang benar dari sistem pemungutan suara adalah untuk memberi suara positif pada jawaban yang lebih baik, bukan untuk memberi suara negatif kepada saya. Lihat juga di sini: stackoverflow.com/help/privileges/vote-down "Gunakan suara negatif Anda setiap kali Anda menemukan pos yang sangat ceroboh, tanpa usaha, atau jawaban yang jelas dan mungkin sangat salah."
TARehman
18

Ada beberapa fungsi di dalam panderpaket:

> 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      
-------------------------------------------
Marius
sumber
4
Terima kasih telah mempromosikan pander:) Harap dicatat bahwa Anda mungkin juga menggunakan metode S3 umum untuk menyimpan beberapa karakter untuk pander(head(iris)[, 1:3])
diketik
12

Tidak terlalu sulit untuk membuat fungsi kustom Anda sendiri. Berikut ini adalah bukti konsep yang sangat sederhana untuk menghasilkan tabel rmarkdown dari 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)
    }

Dalam dokumen .Rmd Anda kemudian akan menggunakan fungsi dengan 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))
```

Kode di atas akan memberi Anda gambar berikut (dalam contoh ini adalah keluaran pdf, tetapi karena tabelnya di markdwon, Anda juga bisa merajut menjadi html atau word juga).

masukkan deskripsi gambar di sini Dari sini - dan membaca kode orang lain - Anda dapat mengetahui cara memanipulasi teks untuk menghasilkan tabel yang Anda inginkan dan membuat fungsi yang lebih personal.

Carlos Cinelli
sumber
1
ini bagus, tapi tahukah Anda bagaimana membuat ini sejajar di sisi kiri daripada di tengah?
Patrick
3

gunakan kombinasi knitr :: kable dan xtable dalam dokumen penurunan harga Anda.

library("knitr","xtable")

untuk data.frame sederhana -

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

format="pandoc" memungkinkan lebih banyak opsi seperti teks.

Sekarang kombinasi untuk ringkasan model .

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

untuk lebih banyak pilihan, lihat stargazerpaket daripada xtable.

contoh untuk penggunaan pribadi

Pankil Shah
sumber
1

Untuk menulis / membuat tabel Markdown di R, Anda juga dapat menggunakan MarkdownReports ' MarkDown_Table_writer_DF_RowColNames() atau MarkDown_Table_writer_NamedVector()fungsi. Anda hanya meneruskan bingkai data / matriks dengan nama dimensi, atau vektor dengan nama, dan itu mengurai & menulis tabel dalam format penurunan harga.

bud.dugong
sumber
0

Fungsi saya untuk 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 | 
Valentas
sumber