प्रोग्रामेटिक रूप से KnitR के साथ R में मार्कडाउन टेबल बना रहा है


103

मैं अभी आर दस्तावेज और रिपोर्ट तैयार करने के लिए निट्रा और मार्कडाउन के उपयोग के बारे में सीखना शुरू कर रहा हूं। यह दिन भर की रिपोर्टिंग के लिए बहुत सही है जो मुझे अपनी नौकरी के साथ करना है। हालाँकि, एक चीज़ जो मुझे दिखाई नहीं दे रही है, वह मार्काड स्वरूपण (पसंद की तरह xtable, लेकिन लाटेक्स या एचटीएमएल के बजाय मार्काडाउन के साथ) का उपयोग करके डेटा फ़्रेम और तालिकाओं को प्रिंट करने का एक आसान तरीका है । मुझे पता है कि मैं केवल HTML आउटपुट को xtable से एम्बेड कर सकता हूं, लेकिन मैं सोच रहा था कि क्या कोई मार्केड-आधारित समाधान थे?


3
Xtable और html को ध्यान में रखते हुए .. के साथ html कोड प्रिंट करें print(xtable(data), type = "html")
user974514

7
@TARehman आपके प्रश्न ने मुझे याद दिलाया कि अभी भी कोई समाधान नहीं था जो सीधे संगत तालिकाओं का उत्पादन करता था knitr, इसलिए मैंने panderतालिका शैली को जोड़ने के लिए एक पुल अनुरोध भेजा । के भविष्य के संस्करणों में pander, आपको ऐसा करने में सक्षम होना चाहिएpandoc.table(iris, style="rmarkdown")
Marius

1
@ क्या आपको पता है कि पांडोक CRAN का हिस्सा क्यों नहीं है? या जब यह इसका हिस्सा बन सकता है? बस उत्सुक।
तारिहमान

2
@Tarehman मुझे पूरा यकीन नहीं है कि आपका मतलब पैंडर है या पंडोक। panderCRAN पर होना चाहिए। पंडोक एक प्रोग्राम हैस्केल में लिखा गया है जो विभिन्न प्रारूपों के विभिन्न प्रकारों से परिवर्तित होता है और किसी भी तरह से आर के लिए विशिष्ट नहीं है।
मारियस

1
क्षमा करें, मेरा मतलब था pander, जो पिछली बार मैंने सुना नहीं था - सीआरएएन पर नहीं था pandoc। मेरी गलती। :)
तारेहमान

जवाबों:


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
जब knitr के अंदर चल रहा है, तो आप formatतर्क को छोड़ सकते हैं , क्योंकि knitr आउटपुट फॉर्मेट के बारे में जानता है और स्वचालित रूप से इसे सेट कर देगा
Yihui Xie

3
@ यिहुई आप अद्भुत हैं
isomorphismes

2
मैंने यह कोशिश की, लेकिन `` {आर} केबल (...) सिर्फ कच्चा निशान दिखाता है
एलेक्स ब्राउन

6
करने के लिए स्थानीय चंक विकल्प सेट करने का प्रयास करें results = asis
आर्टेम क्लेवत्सोव

5
FYI करें knitr को अब प्रारूप में कमांड की आवश्यकता हैresults = 'asis'
Stedy

32

ऐसा करने वाले दो पैकेज पैंडर हैं

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

या अस्की

pander निर्माण की रिपोर्ट करने के लिए थोड़ा अलग दृष्टिकोण है, (लेकिन इस सुविधा के लिए उपयोगी हो सकता है)।

asciiकरने के लिए आप की अनुमति देगा printके साथ type = 'pandoc(या अन्य विभिन्न 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              
--- ------------------ ----------------- ------------------

ध्यान दें कि इन दोनों मामलों में, इसे pandocमार्कडाउन से अपने वांछित दस्तावेज़ प्रकार में बदलने के लिए उपयोग करने के लिए निर्देशित किया जाता है , हालांकि उपयोग करने style='rmarkdown'से तालिकाओं का निर्माण होगा जो इस markdownपैकेज के साथ संगत हैं और इनबिल्ट रूपांतरण में हैं rstudio


3
बस के बारे में एक नोट pander: यह rmarkdownदूसरों के बगल में भी स्टाइल टेबल का उत्पादन कर सकते हैं , जैसे:pander(head(iris[,1:3]), style = 'rmarkdown')
daroczig

@daroczig - धन्यवाद और अब जवाब में उल्लेख किया है,
एम.एल.

26

बस इसे अपडेट करना चाहता था कि मैं क्या कर रहा हूं। मैं hwriterअभी टेबल को प्रिंट करने के लिए पैकेज का उपयोग कर रहा हूं , और सीएसएस कक्षाओं को विभिन्न तत्वों पर लगाने के लिए row.*और col.*सुविधाओं का उपयोग कर रहा हूं । फिर, मैंने अपना प्रदर्शन बनाने के लिए कस्टम सीएसएस लिखा जैसा मैं चाहता था। तो, यहाँ उदाहरण के मामले में किसी और के साथ कुछ इसी तरह का व्यवहार कर रहा है।

सबसे पहले, एक फ़ाइल बनाएं जो knittingHTML में मार्कडाउन को बदल देगी और बदल देगी :

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

library(knitr)
library(markdown)

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

अगला, वास्तविक मार्कडाउन फ़ाइल बनाएँ:

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

अंत में, बस एक कस्टम सीएसएस फ़ाइल बनाएं।

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मुझे file.html देता है, जो इस तरह दिखता है:

उदाहरण आउटपुट

इसलिए, उम्मीद है कि यह उन लोगों के लिए मददगार हो सकता है जो मार्केडाउन आउटपुट में थोड़ा और स्वरूपण चाहते हैं!


1
हाँ, नहीं। मार्कडाउन के साथ काम करेगा -> एचटीएमएल लेकिन मार्कडाउन के साथ नहीं -> पीडीएफ, मार्कडाउन -> डॉक्स ... सवाल यह है कि मार्कडाउन को सामान्य रूप से उपयोग करने के बारे में न केवल एचटीएमएल फाइलों को बनाने के उद्देश्य से - हो सकता है कि आपका इरादा है, लेकिन वहाँ नीचे नहीं लिखा है।
पीटरमेरिस

क्या आपने देखा कि मैं अपने प्रश्न का उत्तर दे रहा हूं? मैं प्रश्न को संपादित कर सकता हूं या इसे अलग तरह से टैग कर सकता हूं अगर आपको लगता है कि इससे मदद मिलेगी?
तारिहमान

संयोग से, इस उत्तर के समय, knitr केवल HTML का समर्थन कर रहा था। इसलिए यह प्रश्न HTML के बारे में स्पष्ट रूप से कुछ नहीं कहता है।
तेरहमैन

जीप, प्रश्न को बदलने में मदद मिलेगी ... लेकिन व्यापक और अधिक सामान्य होने पर सभी के लिए अधिक उपयोग होने पर इसे अधिक विशिष्ट क्यों बनाया जाए? आपके स्वयं के प्रश्न का उत्तर देने के संबंध में, अन्य लोग मार्कडाउन प्रारूप में तालिकाएँ प्रदान करते हैं जो आप HTML प्रारूप में तालिकाएँ प्रदान करते हैं - यह गलत नहीं है, लेकिन मुझे लगता है कि अन्य उत्तर केवल बिंदु तक नीचे, सुरुचिपूर्ण और अधिक सहायक हैं। हर किसी को आपका उत्तर पसंद नहीं आता है, क्या यह पर्याप्त नहीं है जो आपके उत्तर को पसंद करता है?
पीटरमेरिस

7
आपने स्वयं कहा है कि मेरा उत्तर गलत नहीं है, लेकिन यह कि अन्य बेहतर हैं। मतदान प्रणाली का सही अनुप्रयोग बेहतर उत्तरों को बनाए रखना है, न कि मेरा उत्थान करना। यहाँ भी देखें: stackoverflow.com/help/privileges/vote-down "जब भी आप कोई अशिष्ट रूप से मैला-कुचैला, नो-प्रयास-विस्तारित पोस्ट, या स्पष्ट रूप से और संभवतः खतरनाक रूप से गलत उत्तर देते हैं, तो अपने डाउनवोट का उपयोग करें।"
तरेहमैन

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

उपरोक्त कोड आपको निम्नलिखित आंकड़ा देगा (उदाहरण में यह पीडीएफ आउटपुट है, लेकिन चूंकि टेबल मार्कडॉन में है, आप HTML या शब्द में भी बुन सकते हैं)।

यहां छवि विवरण दर्ज करें यहां से - और अन्य लोगों के कोड को पढ़ना - आप यह पता लगा सकते हैं कि आप जिस तालिका को चाहते हैं उसे उत्पन्न करने के लिए पाठ में हेरफेर कैसे करें और अधिक व्यक्तिगत फ़ंक्शन बनाएं।


1
यह बहुत अच्छा है, लेकिन क्या आप जानते हैं कि इसे केंद्र की बजाय बाईं ओर संरेखित कैसे किया जाए?
पैट्रिक

3

अपने मार्कडाउन डॉक्यूमेंट में knitr :: kable और xtable के संयोजन का उपयोग करें।

library("knitr","xtable")

एक साधारण डेटा के लिए।

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

R में मार्कडाउन टेबल लिखने / बनाने के लिए, आप MarkdownReports ' MarkDown_Table_writer_DF_RowColNames() या MarkDown_Table_writer_NamedVector()फ़ंक्शन का भी उपयोग कर सकते हैं । आप बस एक डेटा फ्रेम / मैट्रिक्स पर आयाम नामों के साथ पास करते हैं, या नामों के साथ एक वेक्टर, और यह मार्कर्स प्रारूप में तालिका को पार्स और लिखता है।


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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.