2017-11-14 9 views
0

私はR shinyとvisNetworkで表現したいダイナミックネットワークを持っています。選択されたノードに応じて、いくつかの外部プロトコル/データ(ノードリスト&エッジリスト)に従って、ノードとエッジの色が変わる必要があります。R visUpdateEdges:既存のものを更新する代わりに新しいエッジを作成します

これはノードで非常にうまくいきます:私はノードを選択し、将来のすべてのタイムステップでノードの色がデータに応じて変化します。そのためにはvisUpdateNodesを使用します。

visUpdateEdgesでエッジを基本的に同じにしようとすると、正しく動作しません。ノードの色付けだけでなく、正しい色で新しいノードが作成されます。

簡単な例はここにある:

library(shiny) 
library(tidyverse) 
library(visNetwork) 

# some data - these values are for the updating process 
nodeslist <- list(id1 = data_frame(R1 = c("red", "orange", "orange"), R2 = c("red", 
    "black", "green"), R3 = c("red", "cyan", "yellow")), id2 = data_frame(R1 = c("orange", 
    "red", "orange"), R2 = c("black", "red", "green"), R3 = c("orange", "red", 
    "yellow")), id3 = data_frame(R1 = c("orange", "orange", "red"), R2 = c("black", 
    "yellow", "red"), R3 = c("brown", "cyan", "red"))) 

edgeslist <- list(id1 = data_frame(R1 = c("red", "orange", "orange"), R2 = c("red", 
    "black", "green"), R3 = rep("black", 3)), id2 = data_frame(R1 = c("orange", 
    "red", "orange"), R2 = c("black", "red", "green"), R3 = rep("black", 3)), 
    id3 = data_frame(R1 = c("orange", "orange", "red"), R2 = c("black", "yellow", 
    "red"), R3 = rep("black", 3))) 

# the updating functions 
changeColorOfOtherNodes <- function(nodes, selected.node, index) { 
    nodes %>% mutate(color = unlist(nodeslist[[as.numeric(selected.node)]][, 
    index])) 
} 

changeColorOfEdges <- function(edges, selected.node, index) { 
    edges %>% mutate(color = unlist(edgeslist[[as.numeric(selected.node)]][, 
    index])) 
} 


# making the network 
id <- c(1, 2, 3) 
color <- rep("cyan", length(id)) 
nodes <- data_frame(id, color) 

from <- c(1, 2, 3) 
to <- c(2, 3, 1) 
edges <- data_frame(from, to, color = rep("#333333", 3), value = c(2, 2, 2)) 



# shiny application 
server <- shinyServer(function(input, output, session) { 

    output$netplot <- renderVisNetwork({ 
    visNetwork(nodes, edges) %>% visOptions(nodesIdSelection = list(enabled = TRUE)) 
    }) 

    observe({ 
    if (!is.null(input$netplot_selected) && input$netplot_selected > 0) { 

     for (i in 1:ncol(nodeslist[[as.numeric(input$netplot_selected)]])) { 

     # updating works well for nodes 
     nodes <- changeColorOfOtherNodes(nodes, input$netplot_selected, 
      index = i) 
     visNetworkProxy("netplot") %>% visUpdateNodes(nodes) 
     Sys.sleep(1) 
     # updating for edges -> new edges are creates, but don't know why 
     edges <- changeColorOfEdges(edges, input$netplot_selected, index = i) 
     visNetworkProxy("netplot") %>% visUpdateEdges(edges) 
     Sys.sleep(1) 
     print(edges) 
     } 

    } 
    }) 

}) 


ui <- shinyUI(fluidPage(mainPanel(visNetworkOutput("netplot")))) 
shinyApp(server = server, ui = ui) 

は正しくvisUpdateEdgesでノードの色を更新するためにどのように誰も考えていますか? visUpdateEdgesは、既存のエッジを更新するのではなく、新しいエッジを作成するのはなぜですか?

答えて

1

は、あなたがエッジdata.frameidを設定し、そのvisUpdateEdges

edge <- data.frame(id = 1:3, from = ....) 
# update color of edge 1 
visUpdateEdges(data.frame(id = 1, color = "red")) 
+0

内の既存のエッジを参照するためにそれを使用する必要がはい、それはそれです! idカラムはジョブを行います。ありがとう – user436994

関連する問題