Shiny/visNetwork 中的网络图:与动态组分配不一致的行为

Network plots in Shiny/visNetwork: inconsistent behaviour with dynamic group allocation

我想创建一个应用程序,其中节点的颜色会根据选择的节点动态变化(想法是显示传染模型的输出,其中突出显示的节点是会经历传染性默认值的节点选定的节点 - 所以它并不总是应该突出显示所有直接连接的节点)。原则上,这应该可以通过使用 visUpdateNodes 更新节点的组属性来实现,但是,它的行为似乎很奇怪:

如果我只是简单地更新节点的组属性,那么该应用程序将 "remember" 以前着色的节点 - 即每个曾经着色的节点将保持着色,即使它不应该在当前选择的节点。老实说,我不知道为什么会这样,我尝试了所有我知道的调试技巧,但无法得到答案。我设法使用第二个观察者函数创建了一个变通方法,该函数重置了所有组属性。如果我从 RStudio 运行 我本地 Windows 机器上的应用程序,这会起作用,但奇怪的是,当我 运行 它在我的(Linux-based)服务器上时它不起作用.在那里,应用程序根本不会为节点着色(即使您有时会看到快速的颜色火花,这表明代码已执行,但随后再次调用第二个 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"))))

包的作者刚刚向我指出了 github 上的解决方案 - 结果发现 group = "" 容易出现此类问题。用任何字符串替换空字符串(并删除两个观察者函数中的第一个)在上面的例子中起到了作用。