Неспособность объединить замену строки с sprintf и синтаксисом, подобным Razor, с использованием grViz diagrammeR для блок-схемы - PullRequest
0 голосов
/ 14 июля 2020

Package DiagrammeR в R имеет приятный синтаксис замены строк, подобный Razor, с использованием @@ для меток узлов. В простых однонаправленных блок-схемах, которые я делал в прошлом с помощью digraph flowchart, я имел возможность комбинировать его с дополнительным оператором sprintf() для вставки чисел из таблицы.

Однако я не могу заставить его работать с более новая сложная блок-схема с боковыми рычагами на основе фиктивных узлов, основанная на этом ответе . Вот минимальный воспроизводимый пример.

library(DiagrammeR)
inclusion_flowchart <- grViz(
    sprintf("digraph flowchart {
      # node definitions with substituted label text
      node [fontname = Helvetica, shape = rectangle]
      base [label = '@@1']

      exc1 [label = '@@2']
      rem1 [label = '@@3']

      exc2 [label = '@@4']
      rem2 [label = '@@5']

      exc3 [label = '@@6']
      rem3 [label = '@@7']

      exc4 [label = '@@8']
      rem4 [label = '@@9']

      # downward arrows FROM dummy nodes where a side arrow starts
      node [shape=none, width=0, height=0, label = '']
      side1 -> rem1;
      side2 -> rem2;
      side3 -> rem3;
      side4 -> rem4;

      # side arrows from dummy nodes
      {rank = same; side1 -> exc1}
      {rank = same; side2 -> exc2}
      {rank = same; side3 -> exc3}
      {rank = same; side4 -> exc4}

      # downword LINES TO dummy sites where a side arrow starts
      edge [dir = none]
      base -> side1;
      rem1 -> side2;
      rem2 -> side3;
      rem3 -> side4;
      }

      [1]: 'Included patients with baseline data: n=%s participants'

      [2]: 'Excluded for reason 1: n=%s'
      [3]: 'Remain after exclusion 1: n=%s'

      [4]: 'Excluded for reason 2: n=%s'
      [5]: 'Remain after exclusion 2: n=%s'

      [6]: 'Excluded for reason 3: n=%s'
      [7]: 'Remain after reason 3: n=%s'

      [8]: 'Excluded for reason 4: n=%s'
      [9]: 'Remain after reason 4: n=%s'
      ",
      100, #1, could be extracted from a table
      10, #2, could be extracted from a table
      90, #3, could be extracted from a table
      25, #4, could be extracted from a table
      65, #5, could be extracted from a table
      4, #6, could be extracted from a table
      61, #7, could be extracted from a table
      17, #8, could be extracted from a table
      44 #9, could be extracted from a table
      ) # closes sprintf
  ) # closes grViz call

Но я получаю следующее сообщение об ошибке, которое, очевидно, относится к замене, подобной Razor:

Error in gsub(paste0("@@", i), eval_expressions[[i]][1], spec_body) : 
  invalid 'replacement' argument

Я попытался включить sprintf() в replace_in_spec(), который явно используется в документации DiagrammeR, но в этом не было необходимости в моем предыдущем использовании этой структуры в более простых блок-схемах (к сожалению, я не могу получить эти примеры) и приводит к той же ошибке.

Я подозреваю, что что-то не так со спецификациями моего узла, но я не могу определить проблему. Обратите внимание, что если я уберу синтаксис из любой попытки заменить подстроки, я получу желаемую структуру:

inclusion_flowchart_naked <- grViz("digraph flowchart {
  # node definitions with substituted label text
  node [fontname = Helvetica, shape = rectangle]
  base [label = 'base']

  exc1 [label = 'exc1']
  rem1 [label = 'rem1']

  exc2 [label = 'exc2']
  rem2 [label = 'rem2']

  exc3 [label = 'exc3']
  rem3 [label = 'rem3']

  exc4 [label = 'exc4']
  rem4 [label = 'rem4']

  # downward arrows FROM dummy nodes where a side arrow starts
  node [shape=none, width=0, height=0, label = '']
  side1 -> rem1;
  side2 -> rem2;
  side3 -> rem3;
  side4 -> rem4;

  # side arrows from dummy nodes
  {rank = same; side1 -> exc1}
  {rank = same; side2 -> exc2}
  {rank = same; side3 -> exc3}
  {rank = same; side4 -> exc4}

  # downword LINES TO dummy sites where a side arrow starts
  edge [dir = none]
  base -> side1;
  rem1 -> side2;
  rem2 -> side3;
  rem3 -> side4;
}
") # closes grViz call    

Это: введите описание изображения здесь

Заранее благодарим вас, если вы можете поделиться своими идеями. Я использую R 3.6.2, RStudio 1.2.5033 и DiagrammeR 1.0.5.

...