niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(R) data.treeパッケージを使って環境のツリー構造を表示する

Rとdataとtreeのぐぐらびりてぃの低さですよ...

data.treeというパッケージがあります。

github.com

vignettesが公開されていて、これを見ると良いのですが、

Introduction to data.tree

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

こんな感じ。

f:id:niszet:20180527174224p:plain

対応取れていますね(当たり前ですが…)
View()だと、Autoloadsとtools:rstudioが見てわからない(Show Attributesにチェックを入れて、その環境の要素のname属性を見ればわかります。これを取得しているのが↑のenvironmentName関数というわけですね)ですが、この方法だと確認が楽になりますね。これらの環境自体は知っているのであまり効果はないですが、自作のenvironmentの時には確認に便利です。

Enjoy!!