我已经使用Shiny中的visNetwork软件包构建了我的网络。我想单击一个节点,然后从数据框中显示有关该节点的信息。我已经能够通过单击和近点功能对散点图进行此操作,例如此处显示的Shiny示例中的那些功能:http://shiny.rstudio.com/gallery/plot-interaction-selecting-points.html

对于我的网络,我尝试过:

server <- function(input, output) {
output$network <- renderVisNetwork({
visNetwork(my.nodes, my.edges,
           height = "100%", width = "100%",
           main = "") %>%
visEvents(hoverNode = "function(nodes){
            Shiny.onInputChange('current_node_id',nodes);
            ;}",
            click = "function(){
            Shiny.onInputChange('click',{node: current_node_id});
            ;}"
  )
})

output$shiny_return <- renderPrint({
if(!is.null(input$current_node_id)){
nearPoints(node.data,click$node, addDist = TRUE )
}
})

ui <- fluidPage(
visNetworkOutput("network"),
verbatimTextOutput("shiny_return")
)

但是,我收到一条错误消息:“找不到点击对象”

谢谢您的帮助。

最佳答案

差异点:

  • 您的JavaScript事件click错误。不了解current_node_id,必须使用input$click而不是click$node闪亮地调用
  • nearPoints仅适用于plotOuput。不能与javascript / htmlwidgets函数一起使用。

  • 要使用visNetwork启用这种功能,我只是在最新的dev版本中添加了一个新功能visNearestNodes。这是一个简单的例子:
    # install dev version
    devtools::install_github("datastorm-open/visNetwork")
    
    require(visNetwork)
    require(shiny)
    
    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)
    

    09-30 13:50
    查看更多