Rのデータフレームからhtmlのtable要素を作る(htmltools利用)

データフレームからtable要素を作成する方法について検討しました。

dfをデータフレームとします。

   col1  col2  col3
1 item1 item2 item3
2 item4 item5 item6

すると、このようにしてtable要素を作成できます。

library(htmltools)
library(purrr)
tags$table(pmap(df, ~tags$tr(map(list(...), ~tags$td(.x)))))
<table>
  <tr>
    <td>item1</td>
    <td>item2</td>
    <td>item3</td>
  </tr>
  <tr>
    <td>item4</td>
    <td>item5</td>
    <td>item6</td>
  </tr>
</table>


この記事で使用したRとパッケージのバージョンを記載しておきます。
バージョンが異なると、動作や表示も若干異なる場合があるからです。

  • R 3.6.1
  • htmltools 0.3.6
  • purrr 0.3.2



背景

こちらの記事で、htmltoolsパッケージを使い、htmlのtable要素を作成しました。

RでHTML要素(a, ul, table)を生成する(htmltools利用) | ミサキのノート
RでHTML要素の生成を試しました。使ったパッケージはhtmltoolsです。 生成したのは、こちらの要素です。 a要素ul要素table要素 3つとも問題なく生成できました。 この記事で使用したRとパッケージのバージョンを記載しておきます

その際、データフレームからtable要素を作成できれば便利だなと思い、今回の記事作成に至りました。

データフレームからtable要素を作成する方法は他にもあるようです。
この記事の方法は参考の1つにして頂ければと思います。

方針

データフレームの行を受け取ってtr要素を作成する処理を、全行で行います

tr要素の作成は、こちらの記事で紹介したul要素作成と同じ考え方を採用します。
その理由は、tr要素とul要素は構造が似ているからです。

行単位の処理は、purrrパッケージのpmap関数を使います。
pmap関数は、行に関数を適用し、その結果をリストで返してくれます
以下の使用例を確認して下さい。

pmapの使用例

データフレームを用意し、パッケージを読み込みます。

df <- data.frame(col1 = c("item1", "item4"),
                 col2 = c("item2", "item5"),
                 col3 = c("item3", "item6"),
                 stringsAsFactors = FALSE)
df
   col1  col2  col3
1 item1 item2 item3
2 item4 item5 item6
library(purrr)

例1

pmap(df, ~.x)
[[1]]
[1] "item1"

[[2]]
[1] "item4"

この例では、各行の1つ目(1列目)の要素を取り出しています。
関数は適用していません。

例2

pmap(df, ~paste(.x, .y))
[[1]]
[1] "item1 item2"

[[2]]
[1] "item4 item5"

この例では、各行の1つ目と2つ目の要素を結合しています。

例3

pmap(df, ~..3)
## [[1]]
## [1] "item3"

## [[2]]
## [1] "item6"

このように、要素の指定は番号でも可能です。

例4

pmap(df, ~list(...))
[[1]]
[[1]]$col1
[1] "item1"

[[1]]$col2
[1] "item2"

[[1]]$col3
[1] "item3"


[[2]]
[[2]]$col1
[1] "item4"

[[2]]$col2
[1] "item5"

[[2]]$col3
[1] "item6"

行全体の指定は、list(…)を使います。

map同様(こちらの記事参照)第二引数はチルダ(~)で始め、各要素に対する処理を記述します。

データフレームからtable要素を生成する

まず、ul要素作成と同様の考え方で、tr要素を試しに作ります。

tags$tr(map(list("item1", "item2", "item3"), ~tags$td(.x)))
<tr>
  <td>item1</td>
  <td>item2</td>
  <td>item3</td>
</tr>

無事に作れました。

pmapを使い、この処理をデータフレームの全行に適用します。
その際、list(“item1”, “item2”, “item3”)の箇所は、行全体を表すlist(…)で置き換えます。

pmap(df, ~tags$tr(map(list(...), ~tags$td(.x))))
[[1]]
<tr>
  <td>item1</td>
  <td>item2</td>
  <td>item3</td>
</tr>

[[2]]
<tr>
  <td>item4</td>
  <td>item5</td>
  <td>item6</td>
</tr>

この結果をtags$tableの引数として渡してあげれば、table要素の完成です。

tags$table(pmap(df, ~tags$tr(map(list(...), ~tags$td(.x)))))
<table>
  <tr>
    <td>item1</td>
    <td>item2</td>
    <td>item3</td>
  </tr>
  <tr>
    <td>item4</td>
    <td>item5</td>
    <td>item6</td>
  </tr>
</table>

まとめ

データフレームからtable要素を作成する方法について検討しました。
他のパッケージで既にありそうですが、関数にしても良いかも知れませんね。
では。


YouTube: ミサキさん

問い合わせ先
Mail: caprico.aries@gmail.com
Twitter: https://twitter.com/caprico_aries(無言フォローもお気軽に)

コメント

  1. […] すると、このようにしてtable要素を作成することができます。考え方はこちらの記事と同じです。 […]

  2. […] Rのデータフレームからhtmlのtable要素を作る(htmltools利用) […]