使用KnitR在R中以编程方式创建Markdown表


103

我才刚刚开始了解KnitR以及在生成R文档和报告中使用Markdown。对于我日常工作中的许多日常工作而言,这看起来是完美的。但是,我没有看到的一件事是使用Markdown格式(类似于xtable,但使用Markdown而不是LaTeX或HTML)来打印数据框和表格的简便方法。我知道我可以嵌入xtable的HTML输出,但是我想知道是否有任何基于Markdown的解决方案?


3
考虑使用xtable和html print(xtable(data), type = "html")
user974514 2013年

7
@TARehman您的问题使我想起,仍然没有解决方案可以产生与表直接兼容的表knitr,因此我发送了拉取请求pander以添加表样式。在的将来版本中pander,您应该可以pandoc.table(iris, style="rmarkdown")
Marius

1
@Marius您是否偶然知道pandoc为什么不属于CRAN?或何时可能成为它的一部分?只是好奇。
TARehman 2013年

2
@TARehman我不太确定你是说pander还是pandoc。pander应该在CRAN上。pandoc是用Haskell编写的程序,可与多种不同格式进行相互转换,但它并不以任何方式特定于R。
马吕斯

1
抱歉,我的意思是pander,上次我没听说过这不在CRAN上-没有pandoc。我的错。:)
TARehman

Answers:


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
@Yihui,您很了不起
同构

2
我尝试过这个,但是```{r} kable(...)只是显示原始的降价
Alex Brown

6
尝试将本地块选项设置为results = asis
Artem Klevtsov

5
FYI knitr现在需要以下格式的命令results = 'asis'
Stedy,2014年

32

可以做到这一点的两个软件包是pander

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

ascii

pander 与报表的构建方法略有不同(但对于此功能很有用)。

ascii可以让您print搭配type = '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从markdown转换为所需的文档类型,但是using 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 2014年

您是否注意到我在回答自己的问题?如果您认为有帮助,我可以编辑问题或以其他方式标记该问题?
TARehman 2014年

顺便说一句,在回答此问题时,knitr仅支持HTML。这就是为什么这个问题没有明确提及HTML的原因。
TARehman

轻描淡写,改变问题会有所帮助...但是,当问题变得更广泛,更笼统时,为什么要使其更加具体,以使其对所有人都有用呢?关于您回答自己的问题,其他人提供Markdown格式的表,您提供HTML格式的表-没错,但我发现其他答案简直就是要点,简洁而有用。不是每个人都喜欢您的答案,难道就不喜欢您的答案吗?
petermeissner 2014年

7
您自己已经说过,我的回答没有错,但其他人则更好。投票系统的正确应用是赞成更好的答案,而不是反对我的。另请参见此处:stackoverflow.com/help/privileges/vote-down “每当遇到过分草率,不费吹灰之力的帖子,或者答案明显有可能是危险的错误时,请使用downvotes。”
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 2013年

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

要获得更多选项,请查看stargazerpackage而不是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 | 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.