используя DiagrammeR, как сделать цвет заливки узла зависимым от условия? - PullRequest
3 голосов
/ 24 мая 2019

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

Проблема возникает в выражении 'node [fillcolor = COLOR]'код.
Если я просто напишу 'fillcolor = Green, style = fill' вместо fillcolor = object1, то это работает отлично.Точно так же, если я заменю Зеленый на «Малиновый» или любой другой цвет, проблем не возникнет.

Моя проблема в том, что я хочу, чтобы этот цвет менялся в зависимости от значения объекта, которое определяется условием.По сути, если слишком мало больных собираются обратиться к врачу, это должно поднять красный флажок в отчете, который я создаю ежедневно, и программирование этого вручную каждый день будет немного болезненным.

Что я пробовал:
вместо указания цвета, я пытаюсь использовать вывод условного объекта в качестве цвета заливки (например, то, что я пробовал ниже)

fillcolor = object1 - заполняет последнее поле черным
fillcolor = ', object1' - окончательное поле снова заполняется черным цветом
fillcolor = object1 [1] - выводит результаты с ошибкой
fillcolor = ', object1[1] '- окончательное поле снова заполнено черным цветом

# Just create some random data for a flow chart
a = 100              # Total people
b = 60               # Number of total that are sick
c = 19               # Number of sick that saw a doctor
d = round(c/b * 100) # percent of sick who saw a doctor

# create a flowchart-list-object
flow <- list(a=a, b=b, c=c, d=d)

# this could be where I am going wrong
# Condition that determines if the Percentage of sick people who saw a doctor
# is above 40%
if (d > 40) {
  object1 <- 'Green'
} else
  object1 <- 'Crimson'

# Output the flowchart using grViz
DiagrammeR::grViz("
                  digraph dot {

                  graph[layout = dot, fontsize = 15]

                  # Node numbers with labelled text
                  node [shape = box,
                        width = 3, 
                        fontname = Helvetica]

                  a [label = '@@1']
                  b [label = '@@2']
                  c [label = '@@3']

                  # First set of node to edge connections
                  a -> b -> c

                  node [fillcolor = object1, style = filled]
                  d [label = '@@4']
                  c -> d

                  }

                  [1]: paste0('Total Sick \\n ', flow$a, '')
                  [2]: paste0('Number of total sick \\n ', flow$b, '')
                  [3]: paste0('Number of Sick who see a doctor \\n ', flow$c, '')
                  [4]: paste0('% of sick who see a doctor \\n ', flow$d, '')

                  ")

Я ожидаю, что последнее поле на блок-схеме будет зеленым, если процент заболевших выше 40% или малиновым (красный) если оно ниже 40%.

Спасибо за помощь / помощь!

1 Ответ

3 голосов
/ 24 мая 2019

Вы должны определить цвет как сноску, так же, как метки узлов.Это потому, что object1 является переменной R, а не фактическим значением.В конце я определил его как сноску [5]:.

DiagrammeR::grViz("
                  digraph dot {

                  graph[layout = dot, fontsize = 15]

                  # Node numbers with labelled text
                  node [shape = box,
                  width = 3, 
                  fontname = Helvetica]

                  a [label = '@@1']
                  b [label = '@@2']
                  c [label = '@@3']

                  # First set of node to edge connections
                  a -> b -> c

                  d [style = filled, fillcolor = '@@5', label = '@@4']
                  c -> d

                  }

                  [1]: paste0('Total Sick \\n ', flow$a, '')
                  [2]: paste0('Number of total sick \\n ', flow$b, '')
                  [3]: paste0('Number of Sick who see a doctor \\n ', flow$c, '')
                  [4]: paste0('% of sick who see a doctor \\n ', flow$d, '')
                  [5]: object1
                  ")

enter image description here

...