どのノードが選択されているかに基づいてノードの色が動的に変化するアプリケーションを作成したいとします(contagionモデルの出力を表示するアイデアです。強調表示されたノードは、選択されたノードから伝染的なデフォルトを経験するノードであるため、必ずしも直接接続されているすべてのノードを強調表示する必要はありません。原則として、これはノードのグループプロパティをvisUpdateNodes
に更新することで可能になるはずですが、それは非常に奇妙な動作をしているようです:Shiny/visNetworkのネットワークプロット:動的グループ割り当てとの一貫性のない動作
ノードのグループプロパティを単にudpすると、つまり、現在選択されているノードの下にあってはならない場合でも、一度着色されたすべてのノードは色付きのままです。私は正直なところ、そのような理由が分からないので、私が知っているすべてのデバッグ技を試しましたが、答えを得ることはできませんでした。私は、すべてのグループプロパティをリセットする2番目のオブザーバー関数を使用して回避策を作成しました。これは、RStudioのローカルWindowsマシンでアプリケーションを実行すると機能しますが、不思議なことに、自分の(Linuxベースの)サーバーで実行すると機能しません。そこでは、アプリケーションが単純にノードの色を塗りつぶすことはありません(コードが実行されたことを示す色がすぐに表示されますが、2つ目のoberserver関数が再度呼び出されてプロパティがクリアされます)。
global.R:以下の例は、問題を示し
id <- c(1,2,3,4,5)
group <- rep("",5)
nodes <- data.frame(id,group)
from <- c(1,1,1,2,2,2,3)
to <- c(2,3,4,1,3,5,5)
edges <- data.frame(from,to)
def1 <- c("","Default","Default","","")
def2 <- c("","","Default","Default","")
def3 <- c("","","","Default","")
def4 <- c("","","","","Default")
def5 <- c("","","","","")
defs <- data.frame(def1,def2,def3,def4,def5)
server.R:
library(shiny)
shinyServer(function(input, output) {
output$netplot <- renderVisNetwork({
visNetwork(nodes,edges)%>%
visGroups(
groupname = "Default", color = list(
background = "red"
)
) %>%
visOptions(
nodesIdSelection = list(
enabled = TRUE
)
)
})
observe({
if (!is.null(input$netplot_selected)) {
nodes$group <- rep("A",5)
visNetworkProxy("netplot") %>% visUpdateNodes(nodes)
}
})
observe({
if (!is.null(input$netplot_selected)) {
if(input$netplot_selected!="") {
newgroup <- defs[,as.numeric(input$netplot_selected)]
nodes$group <- newgroup
}
}
visNetworkProxy("netplot") %>% visUpdateNodes(nodes)
})
})
ui.R:
library(visNetwork)
shinyUI(fluidPage(mainPanel(visNetworkOutput("netplot"))))