Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不使用actionButton从visNetwork图形中获取所选节点数据_R_Graph_Shiny_Vis.js - Fatal编程技术网

不使用actionButton从visNetwork图形中获取所选节点数据

不使用actionButton从visNetwork图形中获取所选节点数据,r,graph,shiny,vis.js,R,Graph,Shiny,Vis.js,我使用了本文中给出的示例,但我希望对其进行调整,以显示已选定节点的数据(不是所有节点,而是仅此节点),并且不使用操作按钮,以便在单击节点时立即显示数据 我尝试了许多解决办法,但都没有成功 当我创建图形时,我上传一个CSV文件,并将其他参数关联到节点(大小、标题…)。当我选择一个节点时,是否也可以显示这些参数: 节点$公司名称 节点$公司\邮政编码 节点$amount.size 这里是我开始使用的代码,由@xCloet给出 require(shiny) require(visNetwork)

我使用了本文中给出的示例,但我希望对其进行调整,以显示已选定节点的数据(不是所有节点,而是仅此节点),并且不使用操作按钮,以便在单击节点时立即显示数据

我尝试了许多解决办法,但都没有成功

当我创建图形时,我上传一个CSV文件,并将其他参数关联到节点(大小、标题…)。当我选择一个节点时,是否也可以显示这些参数:

节点$公司名称

节点$公司\邮政编码

节点$amount.size

这里是我开始使用的代码,由@xCloet给出

require(shiny)
require(visNetwork)

server <- function(input, output, session) {
  nodes <- data.frame(id = 1:3, 
                      name = c("first", "second", "third"), 
                      extra = c("info1", "info2", "info3"))
  edges <- data.frame(from = c(1,2), to = c(1,3), id= 1:2)

  output$network_proxy <- renderVisNetwork({
    visNetwork(nodes, edges)
  })


  output$nodes_data_from_shiny <- renderDataTable({
    if(!is.null(input$network_proxy_nodes)){
      info <- data.frame(matrix(unlist(input$network_proxy_nodes), ncol =     dim(nodes)[1],
                        byrow=T),stringsAsFactors=FALSE)
      colnames(info) <- colnames(nodes)
      info
    }
  })

  observeEvent(input$getNodes,{
    visNetworkProxy("network_proxy") %>%
      visGetNodes() 
  })
}

ui <- fluidPage(
  visNetworkOutput("network_proxy", height = "400px"),
  dataTableOutput("nodes_data_from_shiny"),
  actionButton("getNodes", "Nodes")
)

shinyApp(ui = ui, server = server)
require(闪亮)
需要(网络)

服务器要显示所选节点的数据,可以采用中给出的示例。在该示例中,
visEvents
hoverNode
选项用于获取悬停节点的信息

要获取所选节点id,可以使用:

visEvents(select = "function(nodes) {
            Shiny.onInputChange('current_node_id', nodes.nodes);
            ;}")
此函数将节点的id(
nodes.nodes
)设置为
input$current\u node\u id
。然后,您可以使用此信息仅显示对应于该节点的信息(通过对data.frame进行子集设置)

下面提供的示例适用于回答以下问题:

require(shiny)
require(visNetwork)

server <- function(input, output, session) {
  nodes <- data.frame(id = 1:3, 
                      name = c("first", "second", "third"), 
                      extra = c("info1", "info2", "info3"))
  edges <- data.frame(from = c(1,2), to = c(1,3), id = 1:2)

  output$network_proxy <- renderVisNetwork({
    visNetwork(nodes, edges) %>%
      visEvents(select = "function(nodes) {
                Shiny.onInputChange('current_node_id', nodes.nodes);
                ;}")
  })

  output$nodes_data_from_shiny <- renderDataTable( {
    if (!is.null(input$current_node_id) && !is.null(input$network_proxy_nodes)) {
      info <- data.frame(matrix(unlist(input$network_proxy_nodes), 
                                ncol = dim(nodes)[1], byrow = T),
                         stringsAsFactors = FALSE)
      colnames(info) <- colnames(nodes)
      info[info$id == input$current_node_id, ]
    }
  })

  observeEvent(input$current_node_id, {
    visNetworkProxy("network_proxy") %>%
      visGetNodes() 
  })

}

ui <- fluidPage(
  visNetworkOutput("network_proxy", height = "400px"),
  dataTableOutput("nodes_data_from_shiny"),
  actionButton("getNodes", "Nodes")
)

shinyApp(ui = ui, server = server)
require(闪亮)
需要(网络)

服务器提供了另一个建议,因为上面的建议似乎没有那么优雅:

library(shiny)
library(visNetwork)
library(DT)

server <- function(input, output, session) {
  nodes <- data.frame(id = 1:3, 
                      name = c("first", "second", "third"), 
                      extra = c("info1", "info2", "info3"))
  edges <- data.frame(from = c(1,2), to = c(1,3), id = 1:2)

  output$network_proxy <- renderVisNetwork({
    visNetwork(nodes, edges) %>%
      visEvents(select = "function(nodes) {
                Shiny.onInputChange('current_node_id', nodes.nodes);
                ;}")
})


  myNode <- reactiveValues(selected = '')

  observeEvent(input$current_node_id, {
    myNode$selected <<- input$current_node_id
  })

output$table <- renderDataTable({
    nodes[which(myNode$selected == nodes$id),]
})

output$dt_UI <- renderUI({
  if(nrow(nodes[which(myNode$selected == nodes$id),])!=0){
    dataTableOutput('table')
  } else{}

})


}

ui <- fluidPage(
  visNetworkOutput("network_proxy", height = "400px"),
  dataTableOutput("nodes_data_from_shiny"),
  uiOutput('dt_UI')
)

shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(visNetwork)
图书馆(DT)

服务器提供了另一个版本,如果我感兴趣的话,它会更简单

require(shiny)
require(visNetwork)

server <- function(input, output, session) {
  nodes <- data.frame(id = 1:3, 
                      name = c("first", "second", "third"), 
                      extra = c("info1", "info2", "info3pp"))
  edges <- data.frame(from = c(1,2), to = c(1,3), id = 1:2)
  output$network_proxy <- renderVisNetwork({
    visNetwork(nodes, edges) %>%
      visEvents(select = "function(nodes) {
                Shiny.onInputChange('current_node_id', nodes.nodes);
                ;}")
  })

  output$nodes_data_from_shiny <- renderDataTable( {
      info <- data.frame(nodes)

      info[info$id == input$current_node_id, ]

  })

  observeEvent(input$current_node_id, {
    visNetworkProxy("network_proxy") %>%
      visGetNodes() 
  })

}

ui <- fluidPage(
  visNetworkOutput("network_proxy", height = "400px"),
  dataTableOutput("nodes_data_from_shiny")
)

shinyApp(ui = ui, server = server)
require(闪亮)
需要(网络)

非常感谢,这正是我需要的。我只是遇到了一个问题,因为我的节点数组有1000行,当我点击一个节点时,我得到了警告消息:“值'ncol'不正确(太大了)。不客气,@Jpc但是,如果这个答案解决了您的问题,您点击答案左侧的绿色勾号,让其他人知道这是有效的,那就太好了。顺便说一句,@Jpc您成功修复了您收到的警告吗?如果没有,您能提供更多详细信息吗?