代码之家  ›  专栏  ›  技术社区  ›  Vaibhav

在r Shinny中的Visnetwork中撤消单击事件

  •  1
  • Vaibhav  · 技术社区  · 6 年前

    我在Shiny中创建了一个网络图,希望在网络图下方显示所选节点的详细信息。这个链接上标记为正确的答案帮助我实现了这一点。

    Click events for VisNetwork with Shiny

    我想做的另一件事是,当用户单击网络图中的任何其他位置(空白)时,先前单击的节点的信息也应该以取消选择所选节点的相同方式消失。

    请建议是否可行。下面是代码

    library(shiny)
    library(visNetwork)
    
    nodes <- data.frame(id = 1:15, label = paste("Label", 1:15),
                        group = sample(LETTERS[1:3], 15, replace = TRUE))
    
    edges <- data.frame(from = trunc(runif(15)*(15-1))+1,
                        to = trunc(runif(15)*(15-1))+1)
    
    server <- function(input, output, session) {
      output$network <- renderVisNetwork({
        visNetwork(nodes, edges, 
                   height = "100%", width = "100%",
                   main = "") %>%
          visEvents(click = "function(nodes){
                    Shiny.onInputChange('click', nodes.nodes[0]);
                    ;}"
          )
      })
    
      output$shiny_return <- renderPrint({
        visNetworkProxy("network") %>%
          visNearestNodes(target = input$click)
      })
    }
    
    ui <- fluidPage(
      visNetworkOutput("network"), 
      verbatimTextOutput("shiny_return")  
    )
    
    shiny::shinyApp(ui = ui, server = server)
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   kluu    6 年前

    是的,你可以。诀窍是将另一个变量传递给R,这样可以告诉您是在单击节点还是在画布上。如果单击画布,则 node.node 应该是 undefined 。将该信息存储在变量中,将其传递给R,并相应地显示(或不显示)节点信息。

    server <- function(input, output, session) {
      output$network <- renderVisNetwork({
        visNetwork(nodes, edges, 
                   height = "100%", width = "100%",
                   main = "") %>%
          visEvents(click = "function(nodes){
                    Shiny.onInputChange('click', nodes.nodes[0]);
                    Shiny.onInputChange('node_selected', nodes.nodes.length);
                    ;}"
          ) 
      })
    
      output$shiny_return <- renderPrint({
        if (!is.null(input$node_selected) && (input$node_selected == 1)) {
        visNetworkProxy("network") %>%
          visNearestNodes(target = input$click)
        } else {
          invisible()
        }
      })
    } 
    

    编辑:对评论的回答

    observe({
      input$node_selected 
      input$click
        if(!is.null(input$node_selected) && (input$node_selected == 1)){ 
          output$networkTable <- renderDataTable(data.frame(x = runif(10), 
                                                            y = runif(10))) 
        } else { 
          output$networkTable <- renderDataTable(NULL)
        } 
    })