R DiagrammeR软件包 - 动态更新图表

时间:2018-04-30 05:03:17

标签: r diagrammer

我正在尝试在for循环的每一步更新R Studio查看器中的图表。

在循环结束时,我想获得这个:

wish result

但我得到了这个:

bad result

上面的代码是这样的:

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 version 3.4.1(2017-06-30) - &#34; Single Candle&#34; tidyverse 1.2.1 DiagrammeR 1.0.0 RStudio 1.1.383

1 个答案:

答案 0 :(得分:0)

你的功能是正确的,真的。 “糟糕的结果”实际上是第7行中的第一个a_graph %>% render_graph(),并且没有调用更多的图,因此结果。要查看此内容,您可以在之前删除的情节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"))然后调用存储的图。