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
は、既存のエッジを更新するのではなく、新しいエッジを作成するのはなぜですか?
内の既存のエッジを参照するためにそれを使用する必要がはい、それはそれです! idカラムはジョブを行います。ありがとう – user436994