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