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 = ""
容易出现此类问题。用任何字符串替换空字符串(并删除两个观察者函数中的第一个)在上面的例子中起到了作用。
我想创建一个应用程序,其中节点的颜色会根据选择的节点动态变化(想法是显示传染模型的输出,其中突出显示的节点是会经历传染性默认值的节点选定的节点 - 所以它并不总是应该突出显示所有直接连接的节点)。原则上,这应该可以通过使用 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 = ""
容易出现此类问题。用任何字符串替换空字符串(并删除两个观察者函数中的第一个)在上面的例子中起到了作用。