R DiagrammeR package - динамически обновляемая диаграмма - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь обновить диаграмму в средстве просмотра R Studio на каждом шаге цикла for.

В конце цикла я хотел бы получить это:

желаемый результат

Но я получаю это:

плохой результат

Код для вышеупомянутого выглядит так:

library(tidyverse)
library(DiagrammeR)

a_graph <-
  create_graph() %>%
  add_node(label = 'Start', type = 'actif', node_aes = node_aes(fillcolor = "orange",shape = "rectangle"
  ) ) 

a_graph %>% render_graph()


update_my_graph <- function(label, label_from){
  from_id <- which( (a_graph %>% get_node_df())$label==label_from )
  a_graph <<- a_graph %>% 
    select_nodes(
      conditions = 
        type == 'actif') %>%
    set_node_attrs_ws(
      node_attr = fillcolor,
      value = "blue") %>%
    clear_selection() %>% 
    add_node(label = label, from = from_id, type = 'actif', node_aes = node_aes(fillcolor = "orange",shape = "rectangle",fixedsize = FALSE))
  a_graph %>% render_graph(layout = "tree")
}

for(i in 1:5) update_my_graph(i,'Start')

R версия 3.4.1 (2017-06-30) - «Single Candle» Tidyverse 1.2.1 DiagrammeR 1.0.0 RStudio 1.1.383

1 Ответ

0 голосов
/ 30 апреля 2018

Ваша функция правильная, правда. «Плохой результат» - фактически ваш первый a_graph %>% render_graph() в строке 7, и никакие дальнейшие графики не были вызваны, следовательно, результат. Чтобы увидеть это, вы можете стереть сюжет до того, как вы пройдете for(i in 1:5) update_my_graph(i,'Start'). Вы увидите, что сюжет не выводится. И после того, как вы сделали пять обновлений, вы можете снова позвонить a_graph %>% render_graph(layout = "tree"), и вы увидите, что он дал вам тот результат, который вы хотели. Сама функция не печатает сюжет.

Следовательно, просто сделать следующее:

update_my_graph <- function(label, label_from){
  from_id <- which((a_graph %>% get_node_df())$label==label_from)
  a_graph <<- a_graph %>% 
    select_nodes(conditions = type == 'actif') %>%
    set_node_attrs_ws(node_attr = fillcolor, value = "blue") %>%
    clear_selection() %>% 
    add_node(label = label, from = from_id, type = 'actif', 
             node_aes = node_aes(fillcolor = "orange", 
                                 shape = "rectangle", 
                                 fixedsize = FALSE))
  print(a_graph %>% render_graph(layout = "tree"))
}

То есть просто положите print вокруг a_graph %>% render_graph(layout = "tree"). Вы также можете сделать return(a_graph %>% render_graph(layout = "tree")) и вызвать сохраненный график.

...