Simon Ress
Simon Ress

Reputation: 121

How to preview mermaid graph in RStudio viewer?

Background:

It's possible to "use of an external text file with the .mmd file extension can provide the advantage of syntax coloring and previewing in the RStudio Viewer" (DiagrammeR Docs)

What should look like this: Viewer Panel should look like this

Problem:

In my minimal working example the graph is not rendered in the viewer panel but the plain text from the mermaid.mmd-file is printed (see below). How to fix this behavior, so that the chart is rendered?

mermaid.mmd:

graph LR
A-->B

Output in viewer panel:

My Setup

Upvotes: 1

Views: 479

Answers (3)

kategorically
kategorically

Reputation: 316

Change your indentation

graph LR
  A-->B

Upvotes: 0

Grasshopper_NZ
Grasshopper_NZ

Reputation: 765

You can preview your codes as simple as running them like this:

library(DiagrammeR)

DiagrammeR(
  "   
  **graph LR   
  A-->B**   
  ")

You should be able to see this

Upvotes: 1

Simon Ress
Simon Ress

Reputation: 121

Technical Reason for the Problem

I found the problem. It's the implementation of the handling of extern .mmd-files in the DigrammeR::mermaid()-function.

Within the mermaid()-function the htmlwidgets::createWidget(name = "DiagrammeR", x = x, width = NULL, height = NULL, package = "DiagrammeR")-functions takes the processed input x and renders the graph. This functions expects an input in the format "\ngraph LR\nA-->B\n", where every input start and ends with "\n" and each line in your mermaid-code is also separated by "\n". But the input from an extern .mmd-file (readLines("mermaid.mmd", encoding = "UTF-8", warn = FALSE)) looks like this:

"graph LR" "A-->B" (separated strings for each line of mermaid-code)

Transforming the input into the required format can be done by mermaid.code <- paste0("\n",paste0(mermaid.code, collapse = "\n"),"\n")

Unfortunately this processing step is not implemented for extern .mmd-files in DigrammeR::mermaid()

Soultion

  • Build a new mermaid()-function, including the required processing step

  • Replace the mermaid()-function within the DiagrammeR-packages by the new function

    # Build new mermaid()-function
    mermaid.new = function (diagram = "", ..., width = NULL, height = NULL) {
      is_connection_or_file <- inherits(diagram[1], "connection") ||
        file.exists(diagram[1])
      if (is_connection_or_file) {
        diagram <- readLines(diagram, encoding = "UTF-8", warn = FALSE)
        diagram <- paste0("\n",paste0(d, collapse = "\n"),"\n")  # NEW LINE
      }
      else {
        if (length(diagram) > 1) {
          nosep <- grep("[;\n]", diagram)
          if (length(nosep) < length(diagram)) {
              diagram[-nosep] <- sapply(diagram[-nosep], function(c) {
                paste0(c, ";")
              })
          }
          diagram = paste0(diagram, collapse = "")
        }
      }
      x <- list(diagram = diagram)
      htmlwidgets::createWidget(name = "DiagrammeR", x = x, width = width, 
      height = height, package = "DiagrammeR")
    }
    
    #Replace mermaid()-function in DiagrammeR-package
    if(!require("R.utils")) install.packages("R.utils")
    library(R.utils)
    reassignInPackage(name="mermaid", pkgName="DiagrammeR", mermaid.new, keepOld=FALSE)
    
    # Test new function
    DiagrammeR::mermaid("mer.mmd")
    

Upvotes: 1

Related Questions