在 Shiny for visNetwork 中,相当于 hoverEdge 的点击

问题描述

hoverNode 中的 hoverEdgevisEvents 参数允许 Shiny 在用户将鼠标悬停在节点或边缘上时更改输入变量,例如input$current_node_idinput$current_edge_id

然而,对于大型网络,如果鼠标在节点和边缘密集的区域上移动,这可能会很混乱,因为 input$current_node_idinput$current_edge_id 快速连续变化多次,导致滞后。

我只想在用户点击节点或边缘时设置 input$current_node_idinput$current_edge_id,而不是悬停。

这是一个使用 hoverNodehoverEdge 的最小工作示例,基于 https://datastorm-open.github.io/visNetwork/shiny.html

library(visNetwork)
library(shiny)

server <- function(input,output) {
  output$network <- renderVisNetwork({
    # minimal example
    nodes <- data.frame(id = 1:3,label = 1:3)
    edges <- data.frame(from = c(1,2),to = c(1,3))
    
    visNetwork(nodes,edges) %>%
      visInteraction(hover = TRUE) %>%
      visEvents(
                hoverNode = "function(nodes) {
                Shiny.onInputChange('current_node_id',nodes);
                ;}",hoverEdge = "function(edges) {
                Shiny.onInputChange('current_edge_id',edges);
                ;}")
  })
  
  output$shiny_return1 <- renderPrint({
    input$current_node_id
  })
  output$shiny_return2 <- renderPrint({
    input$current_edge_id
  })
}

ui <- fluidPage(
  visNetworkOutput("network"),verbatimtextoutput("shiny_return1"),verbatimtextoutput("shiny_return2")
)

shinyApp(ui = ui,server = server)

以下是我的尝试。它适用于节点,但不适用于边;也就是说,点击一个节点会更新 current_node_id,但点击一条边不会更新 current_edge_id

library(visNetwork)
library(shiny)

server <- function(input,edges) %>%
      visInteraction(hover = TRUE) %>%
      visEvents(
            click = "function(nodes,edges) {
            Shiny.onInputChange('current_node_id',nodes.nodes[0]);
            Shiny.onInputChange('current_edge_id',edges.edges[0]);
            ;}")
  })
  
  output$shiny_return1 <- renderPrint({
    input$current_node_id
  })
  output$shiny_return2 <- renderPrint({
    input$current_edge_id
  })
}

ui <- fluidPage(
  visNetworkOutput("network"),server = server)

它也失败了

Shiny.onInputChange('current_edge_id',edges);

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)