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.