【问题标题】:Undo click event in Visnetwork in r shiny在 r Shiny 中撤消 Visnetwork 中的单击事件
【发布时间】:2018-04-19 05:59:49
【问题描述】:

我在 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)

【问题讨论】:

    标签: r graph shiny vis.js visnetwork


    【解决方案1】:

    是的,你可以。诀窍是将另一个变量传递给 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)
        } 
    }) 
    

    【讨论】:

    • 另外,我在我的应用程序中使用下面的代码,我正在生成您为其单击节点的人的个人资料。单击节点时会出现表格,但当我单击其他地方时它不会消失。 observeEvent(input$click, { if(!is.null(input$node_selected) && (input$node_selected == 1)){ networkData
    • 好的,我看到了两个问题。首先,您没有正确更新output$networkTable,因此即使input$node_selected 发生更改,它也会保持其值。第二个问题是,当您单击图表外时,input$click 也不会自行更新,可能是因为在这种情况下它会变为undefined。我正在修改我的答案以帮助您。
    • 非常感谢您的解决方案。这对我很有效。我在这里看到的主要变化是您没有在 ObserveEvent 中提及任何参数。当我为 input$click 运行事件时,它仅在单击节点时才起作用,并且当我们单击其他地方时它没有刷新值。还是我在这里遗漏了什么?
    • 我还从前两行代码中删除了 input$node_selected 和 input$click ,它仍然有效。请建议是否会因为此编辑而有任何挑战
    • 我没有使用observeEvent,我使用observeobserve 将取决于其中的所有反应变量。因为我想依赖input$node_selectedinput$click,所以我把它们放在里面。您确实可以删除input$node_selected,因为input$node_selected 上有一个if 条件,但如果您想要更新配置文件,您可能必须保留input$click
    猜你喜欢
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2018-07-12
    • 2021-10-23
    • 1970-01-01
    • 2018-10-21
    相关资源
    最近更新 更多