KnitR을 사용하여 R에서 프로그래밍 방식으로 마크 다운 테이블 생성


103

R 문서와 보고서를 생성 할 때 KnitR과 Markdown을 사용하는 방법을 배우기 시작했습니다. 이것은 내 직업과 관련이있는 많은 일상적인 보도에 완벽 해 보입니다. 그러나 내가 보지 못한 한 가지는 Markdown 서식을 사용하여 데이터 프레임과 테이블을 인쇄하는 쉬운 방법입니다 (예 :와 비슷 xtable하지만 LaTeX 또는 HTML 대신 Markdown 사용). xtable에서 HTML 출력 만 임베드 할 수 있다는 것을 알고 있지만 Markdown 기반 솔루션이 있는지 궁금합니다.


3
xtable 고려와 HTML ..와 HTML 코드를 인쇄합니다 print(xtable(data), type = "html").
user974514

7
@TARehman 귀하의 질문은 .NET과 직접 호환되는 테이블을 생성하는 솔루션이 아직 없다는 것을 상기시켜주었습니다 knitr. 그래서 pander테이블 스타일을 추가 하기 위해 풀 요청을 보냈습니다 . 미래의 버전에서는 pander, 당신은 할 수 있어야pandoc.table(iris, style="rmarkdown")
마리우스

1
@Marius 왜 pandoc이 CRAN의 일부가 아닌지 아십니까? 아니면 언제 그것의 일부가 될 수 있습니까? 그냥 궁금해.
TARehman

2
@TARehman 나는 당신이 pander 또는 pandoc을 의미하는지 잘 모르겠습니다. panderCRAN에 있어야합니다. pandoc은 Haskell로 작성된 프로그램으로, 다양한 형식으로 변환하고 어떤 식 으로든 R에만 국한되지 않습니다.
Marius

1
죄송합니다 . pander제가들은 말은 지난번에 CRAN에 없었던 것 pandoc입니다. 내 잘못. :)
TARehman 2013 년

답변:


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을 실행할 때, 당신은 떠날 수 formatknitr는 출력 형식을 인식하고 자동으로 설정하기 때문에, 인수
Yihui시에

3
당신은 놀라운 @Yihui
isomorphismes

2
나는 이것을 시도했지만```{r} kable (...)은 단지 raw markdown을 보여줍니다
Alex Brown

6
로컬 청크 옵션을로 설정하십시오 results = asis.
Artem Klevtsov

5
참고로 knitr 이제 형식의 명령이 필요results = 'asis'
Stedy

32

이를 수행하는 두 개의 패키지는 pander입니다.

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

또는 ascii

pander 보고서 구성에 대한 약간 다른 접근 방식이지만이 기능에 유용 할 수 있습니다.

ascii당신을 수 printtype = '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: rmarkdown다른 테이블 옆에도 스타일 이 지정된 테이블을 생성 할 수 있습니다. 예 :pander(head(iris[,1:3]), style = 'rmarkdown')
daroczig

@daroczig-감사합니다. 그리고 지금 답변에 기록했습니다.
mnel

26

내가하기로 결정한 것으로 이것을 업데이트하고 싶었습니다. hwriter지금 패키지를 사용하여 표를 인쇄하고 row.*col.*기능을 사용하여 CSS 클래스를 다른 요소에 배치 하고 있습니다. 그런 다음 사용자 정의 CSS를 작성하여 원하는대로 디스플레이를 만들었습니다. 그래서, 다른 사람이 비슷한 것을 다루는 경우의 예가 있습니다.

먼저 knittingMarkdown을 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하면 다음과 같은 file.html이 제공됩니다.

예제 출력

따라서 Markdown 출력에서 ​​좀 더 많은 서식을 지정하려는 다른 사용자에게 도움이되기를 바랍니다.


1
예, 아닙니다. Markdown-> HTML에서는 작동하지만 Markdown-> PDF, Markdown-> DOCX에서는 작동하지 않습니다. 문제는 일반적으로 Markdown을 사용하여 HTML 파일을 만드는 목적으로 만 사용할 수 없습니다. 의도는 있지만 거기에 적혀 있지 않습니다.
petermeissner

내가 내 질문에 답하고 있다는 것을 알았습니까? 도움이 될 것 같으면 질문을 편집하거나 다르게 태그를 지정할 수 있습니까?
TARehman 2014 년

덧붙여서,이 답변 당시 knitr는 HTML 만 지원했습니다. 그것이 질문이 HTML에 대해 명시 적으로 말하지 않는 이유입니다.
TARehman 2014 년

지프, 질문을 변경하면 도움이 될 것입니다 ...하지만 더 광범위하고 일반적 일 때 모두에게 더 유용 할 때 더 구체적으로 만드는 이유는 무엇입니까? 자신의 질문에 답하는 것과 관련하여 다른 사람들은 Markdown 형식으로 표를 제공합니다. HTML 형식으로 표를 제공합니다. 틀린 것은 아니지만 다른 답변은 간단하고 우아하고 더 유용합니다. 모두가 당신의 대답을 좋아할 필요는 없습니다. 당신의 대답을 좋아하는 것으로 충분하지 않습니까?
petermeissner

7
당신은 내 대답이 틀린 것이 아니라 다른 사람이 더 낫다고 말한 적이 있습니다. 투표 시스템의 올바른 적용은 더 나은 답변을 찬성하는 것입니다. 또한 여기를 참조하십시오. stackoverflow.com/help/privileges/vote-down "심각하게 조잡하고 노력이 많이 드는 게시물 또는 명확하고 위험 할 수있는 잘못된 답변을 접할 때마다 귀하의 다운 투표를 사용하십시오."
TARehman 2014 년

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

나만의 맞춤형 기능을 만드는 것은 그리 어렵지 않습니다. 다음은 a의 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)
    }

.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 또는 word로도 니트 할 수 있음).

여기에 이미지 설명 입력 여기에서 다른 사람의 코드를 읽고 원하는 테이블을 생성하고보다 개인화 된 기능을 생성하기 위해 텍스트를 조작하는 방법을 파악할 수 있습니다.


1
이것은 훌륭하지만 이것을 중앙 대신 왼쪽에 정렬하는 방법을 알고 있습니까?
Patrick

3

markdown 문서에서 knitr :: 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

R에서 Markdown 테이블을 작성 / 생성하려면 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 | 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.