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

TAR*_*man 101 markdown r knitr r-markdown

我刚刚开始了解KnitR以及使用Markdown生成R文档和报告.这看起来非常适合我日常报道我与工作有关的事情.但是,我没有看到的一件事是使用Markdown格式打印数据框和表的简单方法(有点像xtable,但使用Markdown而不是LaTeX或HTML).我知道我可以从xtable中嵌入HTML输出,但我想知道是否有任何基于Markdown的解决方案?

Art*_*sov 119

现在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|
Run Code Online (Sandbox Code Playgroud)

更新:如果您在文档中获得原始markdown,请尝试setup results = "asis"chunk选项.

  • 在knitr中运行时,你可以省略`format`参数,因为knitr知道输出格式并会自动设置它 (24认同)
  • 尝试将本地块选项设置为`results = asis`. (6认同)
  • FYI knitr现在需要格式为`results ='asis'`的命令 (5认同)
  • @Yihui你很棒 (3认同)
  • 我试过这个,但```{r} kable(...)只显示原始降价 (2认同)

mne*_*nel 31

两个将执行此操作的程序包是pander

library(devtools)
install_github('pander', 'Rapporter')
Run Code Online (Sandbox Code Playgroud)

或者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              
--- ------------------ ----------------- ------------------
Run Code Online (Sandbox Code Playgroud)

请注意,在这两种情况下,它都指向使用pandoc从markdown转换为所需的文档类型,但是使用style='rmarkdown'将创建与此markdown包兼容且内置转换的表rstudio.

  • 只是关于`pander`的一个注释:它可以产生`rmarkdown`样式的表也在其他表旁边,例如:`pander(head(iris [,1:3]),style ='rmarkdown')` (3认同)

TAR*_*man 26

只是想用我所做的事情来更新这个.我现在正在使用该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")
Run Code Online (Sandbox Code Playgroud)

接下来,创建实际的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"))))
```
Run Code Online (Sandbox Code Playgroud)

最后,只需创建一个自定义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;
}
Run Code Online (Sandbox Code Playgroud)

执行./file_knit.r给我file.html,看起来像这样:

示例输出

所以,希望这可能对那些想要在Markdown输出中进行更多格式化的人有所帮助!

  • 你自己说我的答案没错,但其他人更好.投票系统的正确应用是提供更好的答案,而不是向我们投票.另请参见此处:http://stackoverflow.com/help/privileges/vote-down"每当遇到一个令人震惊的草率,不费吹灰之力的帖子,或者一个明显且可能非常不正确的答案时,请使用你的downvotes." (7认同)

Mar*_*ius 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      
-------------------------------------------
Run Code Online (Sandbox Code Playgroud)

  • 感谢您推广`pander` :)请注意,您也可以使用通用的S3方法来保存几个字符,例如:`pander(head(iris)[,1:3])` (4认同)

Car*_*lli 12

制作自己的定制功能并不是很难.这是一个非常简单的概念证明,可以生成一个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)
    }
Run Code Online (Sandbox Code Playgroud)

在.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))
```
Run Code Online (Sandbox Code Playgroud)

上面的代码会给你下面的图(在示例中这是pdf输出,但由于表是在markdwon,你也可以编织成html或word).

在此输入图像描述 从这里开始 - 阅读其他人的代码 - 您可以弄清楚如何操作文本以生成所需的表格并创建更多个性化的功能.