まだ厨二病

RとPyhtonを使ったデータ分析・統計解析らへんの話題をしていくだけ

⭐階層構造になっているファイル(XML, JSON)をRで見やすく表示する

ウェブAPIやオープンデータとして公開されているリソースの提供形式としてXMLJSONが利用されることが多い。RでXMLJSONなどの構造式のファイルを読み込むことは簡単だが、だいたいのパッケージで読み込んだオブジェクトはリストになっている。リストクラスオブジェクトは、構造を把握するのが難しく操作がしにくい。リストデータに対して処理を行う{lambdaR}{rlist}{purrr}を使うためにはその構造を理解していることが前提である。

というわけで気楽にファイルの構造を把握したい。そこでboB Rudis作成の📦パッケージとRStudioを利用する。{xmlview}{jsonview}はそれぞれXMLJSON形式のファイルを読み込んだ後にRStudio上で階層構造を見やすく表示するためのパッケージである。

🤖 使い方

2つのパッケージの働きは類似している。対象のXMLJSONファイルを読み込みのための関数xml2::read_xml()jsonlite::fromJSON()あるいはreadLines()でR上でオブジェクトとしたものをXMLならxml_view()JSONならjson_view()で表示させる。表示にはRStudioのViewerパネルが使われる。手元の構造式のテキストを直接渡しても良い。

library(xml2)
library(xmlview)
# XMLファイルの例として、
# 鯖江市が提供するオープンデータ
# http://www.city.sabae.fukui.jp/pageview.html?id=11552
# の中から
# 「鯖江市西山動物園の動物データ」http://www.city.sabae.fukui.jp/pageview.html?id=12431
# (CC BY)
# を表示させる。このリソースはXMLで提供されている
x <- xml2::read_xml("http://www3.city.sabae.fukui.jp/xml/zoo/nisiyamazoo.xml")
xml_view(x)

するとRStudioのViewerパネルに次のように表示される。

f:id:u_ribo:20160123134725p:plain

表示する際のオプションとして豊富なテーマスタイルが備わっている。json_view()style引数に渡すテーマスタイルの一覧はhighlight_styles()で確認できる(xmlview::highlight_styles()と同じ) 。テーマは highlight.jsのものを使っているらしい。

highlight_styles() %>% {
    # 適当に表示
    sample(., 5) %>% print()
    # 現在のテーマ数
    length(.)
}
## [1] "atelier-plateau.dark"  "monokai"               "monokai_sublime"      
## [4] "paraiso.dark"          "atelier-plateau-light"

## [1] 93

今度はJSONファイルを表示してみよう。

library(jsonview)
json_view('{
    "name": [
        "タイトル"
    ],
    "body_md": [
        "ほげほげ"
    ],
    "tags": [
        "sandbox",
        "demo",
        "package"
    ]
}',
style = "paraiso-light")

f:id:u_ribo:20160123134448p:plain

# readLines経由でも良い
readLines("http://www3.city.sabae.fukui.jp/xml/zoo/nisiyamazoo.xml") %>% 
    xml_tree_view()
# JSONファイルの読み込みはjsonlite::fromJSON()を使うと良い
jsonlite::fromJSON("https://gist.github.com/uribo/66d1c128ec2570976a73/raw/6ddf43945117601a3c1e6da76eff62ef1391f6f5/gistfile1.topojson") %>% 
    json_view()

{xmlview}の方では表示形式をxml_tree_view()とすることもできる。またxml_view()の引数add_filterTRUEを指定すれば表示する領域をインタラクティブに抽出できる。はじめからxpathがわかっていればapply_xpath引数に対象のxpathを渡して表示範囲を制限しても良い。

xml_tree_view(x)
xml_view(x, add_filter = TRUE, apply_xpath = ".//dataroot")
# 上記のものと同じ処理
x %>% xml_find_all(xpath = "./.") %>% xml_view()

{jsonview}リポジトリが公開されたのが今日(2016-01-23)で、まだフィルター機能ついていない。バージョンは0.1.0({xmlview}は0.4.7)。そのうち同等の機能がつくような気がする。

💪 応用例

httr::POST()するときとか、list()オブジェクトをJSONにしたものを渡すことになるので、事前に確認するために使えそう。

list(name = "タイトル", body_md = "ほげほげ", 
    tags = array(c("sandbox", "demo", "package"))) %>% 
    unclass() %>% jsonlite::toJSON() %>% 
    json_view()

ウェブAPIラッパーパッケージでデータを取得した後にも便利。

gh::gh(endpoint = "GET /users/:username/repos", 
    username = "uribo") %>% json_view()

🖥 実行環境

package version source
jsonlite 0.9.19 CRAN (R 3.2.2)
jsonview 0.1.0 Github (hrbrmstr/jsonview@64cc963)
xml2 0.1.2 CRAN (R 3.2.0)
xmlview 0.4.7 Github (hrbrmstr/xmlview@5913b30)