我想创建一个应用程序,其中节点的颜色根据选择的节点动态变化(这个想法是显示传染模型的输出,其中突出显示的节点是那些将遇到来自所选节点的传染性默认值的节点节点 - 因此并不总是只应突出显示所有直接连接的节点。原则上,这可以通过使用visUpdateNodes
更新节点的组属性来实现,但是,它似乎表现得非常奇怪:
如果我只是简单地修改节点的组属性,那么应用程序将“记住”以前着色的节点 - 即,每次着色的每个节点都将保持颜色,即使它不应该在当前选定的节点下。老实说,我不知道为什么会这样,我尝试了所有我知道的调试技巧,却无法得到答案。我设法使用第二个观察者函数创建一个解决方法,该函数重置所有组属性。如果我从RStudio在我的本地Windows机器上运行应用程序,这是有效的,但奇怪的是,当我在我的(基于Linux的)服务器上运行它时它不起作用。在那里,应用程序根本不对节点着色(即使您有时看到快速的颜色火花,这表明代码已执行,但随后再次调用第二个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 :(得分:0)
该软件包的作者刚刚向我指出了github上的一个解决方案 - 事实证明group = ""
容易出现这样的问题。用任何字符串替换空字符串(并删除两个观察者函数中的第一个)都可以解决上面的例子。