Rとdataとtreeのぐぐらびりてぃの低さですよ...
data.tree
というパッケージがあります。
vignettesが公開されていて、これを見ると良いのですが、
Rではtree構造のデータを表示するのはちょっと難儀しますね。ast(abstract syntax tree)であれば、pryr::ast()
とかlobstr::ast()
とかで表示できますね。
これを、他のデータ構造、listとかdata.frameとかでやりたいわけです。data.tree
パッケージでそれが出来ます。といっても使い始めたばかりで細かい部分はわかっていないのですが、上記vignettesを読んでいじってみた範囲でやってみました。
個人的には、environment
の階層構造をパッと表示したいのでして、View()
で確認でも良いのですが、単純にパッケージがどの順序でアタッチされたのか?を見るだけならちょっと手間ですよね。
ということで、とりあえず下記のコードで出来ることを確認しました。
library(magrittr) library(stringr) rlang::env_parents(environment()) %>% purrr::map(environmentName) %>% setNames(., nm = stringr::str_remove(., "package:")) %>% purrr::map(function(.) setNames(as.list(x=.), str_remove(., "package:") )) %>% rev %>% data.tree::as.Node()
で、結果は
levelName 1 Root 2 |--R_EmptyEnv 3 |--base 4 |--Autoloads 5 |--methods 6 |--datasets 7 |--utils 8 |--grDevices 9 |--graphics 10 |--stats 11 |--tools:rstudio 12 |--magrittr 13 °--stringr
となります。上側にR_EmptyEnv
が入ってほしいので、rev
を挟んでいます。
本当は、各パッケージの名前空間の下に入るような構造ですが、それでインデントが深くなって表示しにくいのも微妙だなと思って、特に対応していません。このやり方を継承して、階層構造を正しく?表示をやる場合は、要素を前の要素の子として入れるような、本当に階層構造となったlistを作る必要がありますね。
結構前に思いついたもののやっておらず。ようやく重い腰を上げたのでした…。
個人的にはコレ結構便利…。
追記
ちなみに、View()
で確認すると、
rlang::env_parents(environment()) %>% View()
こんな感じ。
対応取れていますね(当たり前ですが…)
View()
だと、Autoloadsとtools:rstudioが見てわからない(Show Attributesにチェックを入れて、その環境の要素のname属性を見ればわかります。これを取得しているのが↑のenvironmentName
関数というわけですね)ですが、この方法だと確認が楽になりますね。これらの環境自体は知っているのであまり効果はないですが、自作のenvironment
の時には確認に便利です。
Enjoy!!