You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:50:10