使用Shiny单击VisNetwork的事件

时间:2016-10-07 11:45:39

标签: r graph vis.js

我用Shiny中的visNetwork包构建了我的网络。我想单击一个节点,然后从数据框中显示有关该节点的信息。我已经能够使用click和nearpoint函数为散点图执行此操作,例如此处显示的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")  
)

但是,我收到错误说&#34;点击找不到的对象&#34;

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

差异点:

  • 您的javascript事件click错误。不知道current_node_id,必须使用input$click而非click$node
  • 打电话。
  • nearPoints仅适用于plotOuput。不能与javascript / htmlwidgets函数一起使用。

要使用visNetwork启用此类功能,我只需在最新版本中添加新功能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)