KnitRを使用してプログラムでRにMarkdownテーブルを作成する


103

KnitRと、Rドキュメントとレポートを生成する際のMarkdownの使用について学び始めたところです。これは、私が自分の仕事に関係している多くの日々の報告に最適であるように見えます。ただし、私が気付いていないことの1つは、Markdown形式を使用してデータフレームとテーブルを印刷する簡単な方法です(のようなものxtableですが、LaTeXまたはHTMLの代わりにMarkdownを使用)。xtableからのHTML出力を埋め込むことができることは知っていますが、Markdownベースのソリューションがあるかどうか疑問に思っていましたか?


3
xtableとhtmlを検討します。.でHTMLコードを印刷しprint(xtable(data), type = "html")ます。
user974514 2013年

7
@TARehman質問はknitr、と直接互換性のあるテーブルを生成するソリューションがまだないことを思い出しました。そこで、プルリクエストを送信しpanderて、テーブルスタイルを追加しました。の将来のバージョンではpander、実行できるようになるはずですpandoc.table(iris, style="rmarkdown")
Marius

1
@マリウスパンドックがCRANの一部ではない理由を知っていますか?またはそれがその一部になる可能性があるときは?ちょっと興味があるんだけど。
TARehman 2013年

2
@TARehmanあなたがパンダーを意味するのか、パンドックを意味するのか私にはよくわかりません。panderCRANで稼働している必要があります。pandocはHaskellで記述されたプログラムで、さまざまな形式に変換したり、さまざまな形式から変換したりします。Rに固有のものではありません。
マリウス

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内で実行する場合は、format引数を省略できます。knitrは出力形式を認識しており、自動的に設定します
Yihui Xie

3
@Yihuiあなたは素晴らしい
同型写像

2
私はこれを試しましたが、 `` `{r} kable(...)は生のマークダウンを示しています
Alex Brown

6
ローカルチャンクオプションをに設定してみてくださいresults = asis
Artem Klevtsov

5
FYI knitrでは、次の形式のコマンドが必要ですresults = 'asis'
Stedy

32

これを行う2つのパッケージはパンダーです

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

またはアスキー

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
についての注意panderrmarkdownスタイル付きのテーブルを他のテーブルとpander(head(iris[,1:3]), style = 'rmarkdown')
並べて

@daroczig-回答に感謝し、今すぐ注記
mnel

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

次に、実際の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

ジップ、質問を変更すると役立つでしょう...しかし、それがより広くより一般的であるときに、それがすべての人にとってより有用であるのに、なぜそれをより具体的にするのですか?あなた自身の質問への回答に関して、他の人はあなたがHTML形式でテーブルを提供しているMarkdown形式でテーブルを提供しています-それは間違いではありませんが、私は他の回答が単純に簡潔でエレガントでより役立つと思います。誰もがあなたの答えを好きである必要はありませんが、あなたの答えが好きだっただけでは十分ではありませんか?
petermeissner 2014

7
あなた自身が私の答えは間違っていないと言いましたが、他の人はより良いです。投票システムの正しい適用は、より良い答えに賛成することであり、私の投票に反対することではありません。こちらもご覧ください:stackoverflow.com/help/privileges/vote-down「ひどくずさんな、努力を費やさない投稿、または明らかにそしておそらく危険なほど正しくない回答に遭遇した場合は、常に反対票を使用してください。」
TARehman '19 / 09/19

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

独自にカスタマイズした関数を作成することはそれほど難しくありません。以下は、の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

マークダウンドキュメントで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にマークダウンテーブルを作成し、あなたも使用することができます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.