Rのリストからhtmlのtable要素を作る(htmltools利用)

リストからhtmlのtable要素を作成する方法について検討しました。

dlをリストとします。

dl
$no
[1] 1 2 3

$link
[1] "site_name_1" "site_name_2" "site_name_3"

$a
$a[[1]]
<a href="https://...1" download="filename1">https://...1</a>

$a[[2]]
<a href="https://...2" download="filename2">https://...2</a>

$a[[3]]
<a href="https://...3" download="filename3">https://...3</a>

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

library(htmltools)
library(purrr)
tags$table(pmap(dl, ~tags$tr(map(list(...), ~tags$td(.x)))))
<table>
  <tr>
    <td>1</td>
    <td>site_name_1</td>
    <td>
      <a href="https://...1" download="filename1">https://...1</a>
    </td>
  </tr>
  <tr>
    <td>2</td>
    <td>site_name_2</td>
    <td>
      <a href="https://...2" download="filename2">https://...2</a>
    </td>
  </tr>
  <tr>
    <td>3</td>
    <td>site_name_3</td>
    <td>
      <a href="https://...3" download="filename3">https://...3</a>
    </td>
  </tr>
</table>


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

  • R 3.6.1
  • htmltools 0.3.6
  • purrr 0.3.2



背景

こちらの記事で、データフレームからtable要素を作成しました。

Rのデータフレームからhtmlのtable要素を作る(htmltools利用) | ミサキのノート
データフレームからtable要素を作成する方法について検討しました。 dfをデータフレームとします。 col1 col2 col3 1 item1 item2 item3 2 item4 item5 item6 すると、このようにしてtab

データフレームは(同じ長さの)ベクトルで構成されています。

そのため、ベクトルの要素にできないa要素などはデータフレームに含めることができず、上記の記事のように、一気にtable要素を作ることができません。

しかし、同じ方法で作れた方が分かりやすいですよね。

リストの限定された形がデータフレームです。
また、リストはベクトルの要素にできないものも要素にすることができます

そのため、リストからのtable要素生成を検討することにしました。

方針

考え方は、データフレームからtable要素を作成したこちらの記事と同じです。

データフレームのに対応するのが、リストを構成する各要素です。
そして、データフレームの i (i=1, 2, 3, …) 行目に対応するのが、リストを構成す各要素の i (i=1, 2, 3, …)番目の要素です。

行単位の処理に用いたpurrrパッケージのpmap関数は、データフレームだけではなく、より一般的なデータ構造であるリストにも適用できます

リストからtable要素を生成する

table要素の作成は、こちらの記事と同じ考え方なので、引数として与えるリスト作成について説明します。

まず、データフレームに含められないものをリストにします。

library(htmltools)
library(purrr)

df <- data.frame(contents = c("https://...1", "https://...2", "https://...3"),
                 href     = c("https://...1", "https://...2", "https://...3"),
                 download = c("filename1", "filename2", "filename3"))
aList <- pmap(df, ~tags$a(list(...)$contents, href = list(...)$href, download = list(...)$download))
aList
[[1]]
<a href="url1" download="filename1">link1</a>

[[2]]
<a href="url2" download="filename2">link2</a>

[[3]]
<a href="url3" download="filename3">link3</a>

次に、データフレームにできる部分は、そのままデータフレームにします。

df <- data.frame(no = c(1, 2, 3),
                 link = c("site_name_1", "site_name_2", "site_name_3"),
                 stringsAsFactors = FALSE)

両者を結合します。

dl <- as.list(df)
dl <- c(dl, a = list(aList))
dl
$no
[1] 1 2 3

$link
[1] "site_name_1" "site_name_2" "site_name_3"

$a
$a[[1]]
<a href="https://...1" download="filename1">https://...1</a>

$a[[2]]
<a href="https://...2" download="filename2">https://...2</a>

$a[[3]]
<a href="https://...3" download="filename3">https://...3</a>

できあがったリストを引数として与えると、table要素の完成です。

tags$table(pmap(dl, ~tags$tr(map(list(...), ~tags$td(.x)))))
<table>
  <tr>
    <td>1</td>
    <td>site_name_1</td>
    <td>
      <a href="https://...1" download="filename1">https://...1</a>
    </td>
  </tr>
  <tr>
    <td>2</td>
    <td>site_name_2</td>
    <td>
      <a href="https://...2" download="filename2">https://...2</a>
    </td>
  </tr>
  <tr>
    <td>3</td>
    <td>site_name_3</td>
    <td>
      <a href="https://...3" download="filename3">https://...3</a>
    </td>
  </tr>
</table>

まとめ

リストからtable要素を生成する方法について検討しました。
データフレームはリストの一種であり、pmapはリスト処理の関数です。
そのため、データフレームからのtable要素生成と同じ考え方になるのは、当然と言えば当然かも知れませんね。
では。

--
YouTube: ミサキさん

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

コメント

  1. […] 昨日の記事に書いたRのコードを、%>%(パイプ)演算子を使って見やすく書き直しました。 […]

  2. […] Rのリストからhtmlのtable要素を作る(htmltools利用) […]