R Markdownは便利ですがダイアグラムやシーケンス図を描きたい場合には、別のアプリケーションで描いてから図として貼り付けている場合が多いと思います。ただ、再現可能を考えた場合、図として貼り付けう方法は好ましい方法ではありません。そこで、再現可能を担保しつつVCSでソース管理も可能なDiagrammeR
パッケージを紹介します。DiagrammeR
パッケージはGraphviz
やmermaid
といった描画ツールを扱うことが可能です。今回はmermaid
を使ったシーケンス図の絵描き方です。
Packages and Datasets
本ページではR version 3.5.2 (2018-12-20)の標準パッケージ以外に以下の追加パッケージを用いています。
Package | Version | Description |
---|---|---|
DiagrammeR | 1.0.0 | Graph/Network Visualization |
knitr | 1.21 | A General-Purpose Package for Dynamic Report Generation in R |
tidyverse | 1.2.1 | Easily Install and Load the ‘Tidyverse’ |
mermaid
DiagrammeR
パッケージがサポートするもう一つのライブラリはmermaid.js
ライブラリです。mermaid.js
ライブラリを用いることテキストベースでシーケンス図やガントチャートを描くことができます。
シーケンス図の基本
シーケンス図はアクター(縦軸になるオブジェクト)とアクター間のメッセージを記述するだけで描けます。例えば
DiagrammeR::mermaid("
sequenceDiagram
Client->>Server: request
Server->>Client: response
")
このようにアクター(この場合はClinet
とServer
)を->>
で結び、:
の後にメッセージ名を記述するだけです。日本語での記述も可能です。なお、->>
の前後や:
の前には空白を入れないようにしてください。
participant
アクターは登場順に自動的に追加されますが、アクターの配置を明示的に指定したい場合にはparticipant
を用いて指定します。例えば
DiagrammeR::mermaid("
sequenceDiagram
participant Local DB
participant Client
participant Server
participant DB
Client->>Server: request
Server->>DB: SQL request
DB->>Server: SQL response (data)
Server->>Client: response
Client->>Local DB: store data
")
空白の扱い
participant
を利用してアクターを指定した場合、->>
の前後や:
の前に空白を入れてしまうと空白がある別アクター(Clinet
とClient
)と判断されてしまいます。participant
や後述のas
を利用する場合には注意してください。
DiagrammeR::mermaid("
sequenceDiagram
participant Local DB
participant Client
participant Server
participant DB
Client ->>Server: request
Server->> DB: SQL request
DB ->> Server: SQL response (data)
Server->>Client : response
Client->>Local DB: store data
")
エイリアス
アクターやメッセージに日本語を利用することも可能でが、日本語だと記述が複雑になって嫌だなというような場合にはparticipant
指定時にas
を使ってエイリアスを指定してください。
DiagrammeR::mermaid("
sequenceDiagram
participant LDB as ローカル DB
participant CL as Client
participant SV as Server
participant DB as データベース
CL->>SV: 検索文字列
SV->>DB: DBMSへ検索要求(SQL)
DB->>SV: DBMSからの検索結果(SQL)
SV->>CL: 検索結果
CL->>LDB: 検索結果の格納
")
条件分岐
処理を条件分岐を記述する場合にはalt
、else
、end
を用います。例えば検索結果なかったような場合には以下のように記述します。
DiagrammeR::mermaid("
sequenceDiagram
participant LDB as ローカル DB
participant CL as Client
participant SV as Server
participant DB as データベース
CL->>SV: 検索文字列
SV->>DB: DBMSへ検索要求(SQL)
DB->>SV: DBMSからの検索結果(SQL)
alt 検索OK
SV->>CL: 検索OK応答
CL->>LDB: 検索結果の格納
else 検索NG
SV->>CL: 検索NG応答
Note over CL: Display Error
end
")
なお、Note
では日本語が使えないようです。
アクティベーション
残念ながらDiagrammeR
パッケージではアクティベーション表記はサポートされていないようです。
DiagrammeR::mermaid("
sequenceDiagram
participant LDB as ローカル DB
participant CL as Client
participant SV as Server
participant DB as データベース
CL->>SV: 検索文字列
SV->>+DB: DBMSへ検索要求(SQL)
DB->>-SV: DBMSからの検索結果(SQL)
alt 検索OK
SV->>CL: 検索OK応答
CL->>LDB: 検索結果の格納
else 検索NG
SV->>CL: 検索NG応答
Note over CL: Display Error
end
")
メッセージ
アクター間のメッセージには以下の種類を指定することが可能ですが、DiagrammeR
パッケージでは非同期を表す十字付きのメッセージは多少異なる表記になるようです。
記述 | 表示される線の形 |
---|---|
-> |
矢印なしの実線 |
--> |
矢印なしの点線 |
->> |
矢印付きの実線 |
-->> |
矢印付きの点線 |
-x |
末尾に十字がある実線(非同期) |
--x |
末尾に十字のある点線(非同期) |
DiagrammeR::mermaid("
sequenceDiagram
A->B: Solid line
A-->B: Dotted line
A->>B: Solid line w/ arrow
A-->>B: Dotted Line w/ arrow
A-XB: Solid line w/ cross
A--XB: Dotted Line w/ cross
")
DiagrammeR::DiagrammeR("
sequenceDiagram
participant customer as 顧客
participant ticket seller as 代理店
participant database
participant printer as プリンタ
customer->>ticket seller: ask ticket
ticket seller->>database: seats
alt tickets available
database->>ticket seller: ok
ticket seller->>customer: confirm
customer->>ticket seller: ok
ticket seller->>database: book a seat
ticket seller->>printer: print ticket
else sold out
database->>ticket seller: none left
ticket seller->>customer: sorry
end
")
参考資料
Enjoy!