2016-09-05 6 views
0

どのノードが選択されているかに基づいてノードの色が動的に変化するアプリケーションを作成したいとします(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")))) 

答えて

0

パッケージの作者だけ私はgithubの解決策を指摘しました - それはgroup = ""がそのような問題を起こしやすいことが判明しました。上記の例では、空の文字列を任意の文字列に置き換えて(そして、2つのオブザーバ関数のうち最初のものを削除して)トリックを行います。

関連する問題