VisNetwork中nodesIdSelection与selectNode行为不一致问题求助
在VisNetwork中让nodesIdSelection下拉选择触发selectNode逻辑的解决方案
问题核心:使用nodesIdSelection生成的下拉列表选择节点时,不会触发visEvents中定义的selectNode回调逻辑,导致无法触发R控制台的节点ID输出,但直接点击节点时功能正常。
解决方法
nodesIdSelection的下拉选择动作默认不会触发selectNode事件,需要手动为其添加onChange回调函数,同步执行和selectNode相同的逻辑——更新Shiny的输入值current_node_id。
修改后的完整代码如下:
library(shiny) library(visNetwork) ui <- fluidPage( visNetworkOutput('network') ) server <- function(input, output, session) { getDiagramPlot <- function(nodes, edges){ v <- visNetwork( nodes, edges ) %>% visPhysics(stabilization = TRUE, enabled = TRUE) %>% visOptions(highlightNearest = list(enabled = T, degree = 1, hover = F), nodesIdSelection = list( enabled = TRUE, main = "Select ID", # 添加onChange回调,同步更新current_node_id onChange = "function(selected) { Shiny.onInputChange('current_node_id', [selected]); }" ), autoResize = TRUE, collapse = FALSE) %>% visEdges(color = list(highlight = "red")) %>% visLayout(improvedLayout = TRUE) %>% visEdges(arrows = edges$arrows) %>% visInteraction(multiselect = F) %>% visEvents(selectNode = "function(nodes) { Shiny.onInputChange('current_node_id', nodes.nodes); ;}") return(v) } testFunction <- function(node_id){ print(paste("The selected node ID is:", node_id)) } nodes <- data.frame(id = 1:3, label = 1:3) edges <- data.frame(from = c(1,2), to = c(1,3)) output$network <- renderVisNetwork( getDiagramPlot(nodes, edges) ) observeEvent(input$current_node_id,{ testFunction(input$current_node_id) }) } shinyApp(ui, server)
说明
- 在
nodesIdSelection的配置中新增onChange函数,当下拉选择变化时,将选中的节点ID包装为数组(和selectNode事件中nodes.nodes的格式保持一致),通过Shiny.onInputChange更新current_node_id。 - 这样无论是直接点击节点,还是通过下拉列表选择节点,都会触发
observeEvent(input$current_node_id)的逻辑,控制台正常输出节点ID信息。
内容的提问来源于stack exchange,提问作者Corentin Wicht
相关产品推荐
相关产品推荐

