DiagrammeR入門　NDFとEDF

**2017/03/06 追記: 現在NDFとEDFの仕様が変更され，このコードでは動きません。また公式サイトのドキュメントでは更新されていないため，再度調査と検証が必要となっています。出来る限り早く対応したいとは思いますが，もうしばらくお待ちください…**

## DiagrammeR Node and Edge Data Frames

[本家のドキュメント該当箇所](http://rich-iannone.github.io/DiagrammeR/ndfs_edfs.html)を参考にテストします。なお出力は画面キャプチャしたものです。同一の内容を[RPubsにも公開](http://rpubs.com/kazutan/NDF_EDF)しています。こちらのほうが出力がそのままなので感覚がつかみやすいかと思います。


### DiagrammeR
ダイアグラムを作成するパッケージです。詳細は[本家ドキュメント](http://rich-iannone.github.io/DiagrammeR/index.html)を見てください。非常に充実していますが日本語でのドキュメントはほとんどないです。

### DataFrameからNodeとEdgeを作成
データフレームからダイアグラムを作成するにはNode用のデータフレームとEdge用のデータフレームを作成する必要があります。

#### Node Data Frame(NDF)の作成
詳しくは"Creating an NDF"を参考にしてください。できるだけ最小なものを作ります。


```r
library(DiagrammeR)
nodes_1 <- 
  create_nodes(nodes = c(letters[1:3]))
nodes_1
```

```
##   nodes type label
## 1     a          a
## 2     b          b
## 3     c          c
```

`create_nodes(nodes=c())`でノードを作成します。`nodes`がNodeのidで、`label`を指定しなければそのままこのidがラベル(ノード内に表示される文字)となります。1レコード(行)の内容が1つのノードの情報となります。

#### Edge Data Frame(EDF)の作成
詳しくは"Creating an EDF"を参考にしてください。できるだけ最小なものを作ります。


```r
edges_1 <-
  create_edges(from = c("a","b"),
               to = c("c","c"))
edges_1
```

```
##   from to rel
## 1    a  c    
## 2    b  c
```

`create_edges(from=(),to=())`でエッジを作成します。`from`はエッジがスタートするノードで、`to`はエッジが到達するノードを指定します。1レコード(行)の内容が1つのエッジの情報となります。

### NDFとEDFからダイアグラム作成
以上2つから、ダイアグラムを作成します。詳細は[本家のドキュメント該当箇所](http://rich-iannone.github.io/DiagrammeR/graph_creation.html)を参照してください。


```r
graph <- create_graph(
  nodes_df = nodes_1,
  edges_df = edges_1
)
str(graph)
```

```
## List of 10
##  $ graph_name : NULL
##  $ graph_time : NULL
##  $ graph_tz   : NULL
##  $ nodes_df   :'data.frame':	3 obs. of  3 variables:
##   ..$ nodes: chr [1:3] "a" "b" "c"
##   ..$ type : chr [1:3] "" "" ""
##   ..$ label: chr [1:3] "a" "b" "c"
##  $ edges_df   :'data.frame':	2 obs. of  3 variables:
##   ..$ from: chr [1:2] "a" "b"
##   ..$ to  : chr [1:2] "c" "c"
##   ..$ rel : chr [1:2] "" ""
##  $ graph_attrs: NULL
##  $ node_attrs : NULL
##  $ edge_attrs : NULL
##  $ directed   : logi TRUE
##  $ dot_code   : chr "digraph {\n\n  'a' [label = 'a'] \n  'b' [label = 'b'] \n  'c' [label = 'c'] \n  'a'->'c' \n  'b'->'c' \n}"
##  - attr(*, "class")= chr "dgr_graph"
```

`create_graph()`で`graph`クラスのオブジェクトを作成します。先ほど作成したNDFとEDFを上記コードのように指定すればOKです。なお`str(graph`を見てもらえれば、だいたいどんな情報を持っているかがわかるかと思います。

なお、このままでは肝心のダイアグラムが表示されませんのでレンダリングします。


```r
render_graph(graph)
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/35118/7e850e3f-0952-38b9-a246-5aabb3c75615.png" width="400" alt="NDF_EDF1.png">


`render_graph()`でレンダリングします。RStudioならViewerで表示されますし、このようにRmdなら出力として表示されます。なお、デフォルトで出力されるのは`grVis`の標準スタイルです。mermaidの方を指定する方法は…そのうち検討します。

引数の`output=`でいくつか指定するとタイプが違ったものがでます。詳しくは`?render_graph`を参照してください。


```r
render_graph(graph, output = "vivagraph")
```

![NDF_EDF2.png](https://qiita-image-store.s3.amazonaws.com/0/35118/cd09d108-9fbf-f8cc-e682-d728eebfe971.png)


```r
render_graph(graph, output = "visNetwork")
```

![NDF_EDF3.png](https://qiita-image-store.s3.amazonaws.com/0/35118/6d953b19-b676-2b57-4980-b4c695177dce.png)


ここまでの知識があれば、最低限ダイアグラムを作成することが可能です。もちろん、このパッケージはもっといろんなことがたくさん出来るようになっています。それらについてはまたいつか。

Enjoy!