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

Posted

技术标签:

【中文标题】使用 KnitR 以编程方式在 R 中创建 Markdown 表【英文标题】:Programmatically creating Markdown tables in R with KnitR 【发布时间】:2013-03-07 11:16:33 【问题描述】:

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

【问题讨论】:

考虑xtable和html..用print(xtable(data), type = "html")打印html代码。 @TARehman 你的问题提醒了我,仍然没有生成与knitr 直接兼容的表格的解决方案,所以我向pander 发送了拉取请求以添加表格样式。在pander 的未来版本中,您应该能够做到pandoc.table(iris, style="rmarkdown") @Marius 你知道为什么 pandoc 不是 CRAN 的一部分吗?或者什么时候它可能成为它的一部分?只是好奇。 @TARehman 我不太确定你的意思是 pander 还是 pandoc。 pander 应该在 CRAN 上。 pandoc 是一个用 Haskell 编写的程序,它可以在各种不同的格式之间进行转换,它在任何方面都不是特定于 R 的。 抱歉,我的意思是 pander,上次我听到的不是 CRAN - 不是 pandoc。我的错。 :) 【参考方案1】:

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

【讨论】:

感谢推广pander :) 请注意,您也可以使用通用 S3 方法来保存一些要输入的字符,例如:pander(head(iris)[, 1:3])【参考方案2】:

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

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

或ascii

pander 是一种稍微不同的报告构造方法,(但对于此功能很有用)。

ascii 将允许您使用type = 'pandoc(或其他各种降价风格)来print

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 转换为所需的文档类型,但是使用 style='rmarkdown' 将创建与此 markdown 包兼容的表和 @ 中的内置转换987654332@.

【讨论】:

只是一个关于pander的注释:它可以生成rmarkdown样式的表格,例如:pander(head(iris[,1:3]), style = 'rmarkdown') @daroczig -- 谢谢并在回答中注明,【参考方案3】:

只是想用我决定做的事情来更新这个。我现在使用hwriter 包来打印表格,并使用row.*col.* 功能将CSS 类放在不同的元素上。然后,我编写了自定义 CSS 来制作我想要的显示。所以,这里有一个例子,以防其他人正在处理类似的事情。

首先,创建一个将执行knitting 的文件并将 Markdown 更改为 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 输出中进行更多格式设置的其他人有所帮助!

【讨论】:

是的,不。将与 Markdown-->HTML 一起使用,但不适用于 Markdown-->PDF、Markdown-->DOCX ...问题是关于使用 Markdown 通常不仅是为了使用它创建 HTML 文件——可能是你的意图,但没有写在那里。 你注意到我在回答我自己的问题了吗?如果您认为有帮助,我可以编辑问题或以不同方式标记它? 顺便说一句,在这个答案的时候,knitr 只支持 HTML。这就是为什么这个问题没有明确说明 HTML 的原因。 jip,改变这个问题会有所帮助......但是当它更广泛和更普遍时,为什么要让它更具体呢?关于您回答自己的问题,其他人以 Markdown 格式提供表格,您以 HTML 格式提供表格 - 这没有错,但我发现其他答案简单明了,优雅且更有帮助。不是每个人都必须喜欢你的回答,喜欢你的回答还不够吗? 你自己也说过我的回答没有错,但别人更好。投票系统的正确应用是对更好的答案投赞成票,而不是对我的答案投反对票。也可以在这里查看:***.com/help/privileges/vote-down“每当你遇到一个非常草率、不费吹灰之力的帖子,或者一个明显不正确且可能危险地不正确的答案时,请使用你的反对票。”【参考方案4】:

现在 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" 块选项。

【讨论】:

在 knitr 中运行时,您可以省略 format 参数,因为 knitr 知道输出格式并会自动设置它 @易慧你太棒了 我试过了,但是```r kable(...) 只显示原始降价 尝试将本地块选项设置为results = asis 仅供参考 knitr 现在需要格式为results = 'asis'的命令【参考方案5】:

制作自己的自定义函数并不难。这是一个非常简单的概念证明,用于生成data.frame 的 rmarkdown 表:

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

从这里 - 并阅读其他人的代码 - 您可以弄清楚如何操作文本以生成您想要的表格并创建更多个性化的功能。

【讨论】:

这很好,但你知道如何让它在左侧而不是居中对齐吗?【参考方案6】:

在您的降价文档中使用 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

example for personal use

【讨论】:

【参考方案7】:

要在 R 中编写/创建 Markdown 表,您还可以使用 MarkdownReports' MarkDown_Table_writer_DF_RowColNames()MarkDown_Table_writer_NamedVector() 函数。您只需传递带有维度名称的数据框/矩阵或带有名称的向量,它会解析并以 Markdown 格式写出表格。

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于使用 KnitR 以编程方式在 R 中创建 Markdown 表的主要内容,如果未能解决你的问题,请参考以下文章

使用 JPA 以编程方式在 Oracle 中创建序列

Rmarkdown(knitr chunk)文档中生成的多个(R)绘图图形

使用 CoreAudio 以编程方式在 Swift 中创建聚合音频设备

如何以编程方式在 iphone 中创建图表

以编程方式寻址在 xaml 中创建的画布

如何在剑道中创建没有弹出窗口的事件?还是以编程方式创建事件?