シーケンス図を描く
Text Update: 02/27, 2019 (JST)

R Markdownは便利ですがダイアグラムやシーケンス図を描きたい場合には、別のアプリケーションで描いてから図として貼り付けている場合が多いと思います。ただ、再現可能を考えた場合、図として貼り付けう方法は好ましい方法ではありません。そこで、再現可能を担保しつつVCSでソース管理も可能なDiagrammeRパッケージを紹介します。DiagrammeRパッケージはGraphvizmermaidといった描画ツールを扱うことが可能です。今回は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
")

このようにアクター(この場合はClinetServer)を->>で結び、:の後にメッセージ名を記述するだけです。日本語での記述も可能です。なお、->>の前後や:の前には空白を入れないようにしてください。

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を利用してアクターを指定した場合、->>の前後や:の前に空白を入れてしまうと空白がある別アクター(ClinetClient)と判断されてしまいます。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: 検索結果の格納
")

条件分岐

処理を条件分岐を記述する場合にはaltelseendを用います。例えば検索結果なかったような場合には以下のように記述します。

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