#r #graph #shiny #shinydashboard
#r #График #блестящий #shinydashboard
Вопрос:
Я построил сетевой график с помощью visNetwork и Shiny. Я очень доволен результатами. Что я хотел бы сделать, так это использовать панель поиска (например: http://projects .flowingdata.com/tut/interactive_network_demo /) для поиска узлов в моих данных.
Я использую shinydashboard. Поэтому я попытался использовать «sidebarSearchForm». Однако, когда я запускаю приложение и пытаюсь использовать форму поиска, ничего не возвращается.
Вот мой код для пользовательского интерфейса:
ui <- dashboardPage(skin = "black",
dashboardHeader(),
dashboardSidebar(
sidebarMenu(
menuItem("Network", tabName = "network", icon = icon("dashboard")),
sidebarSearchForm(textId = "searchText", buttonId = "searchButton", label = "Search...")
)
),
dashboardBody(
box(
title = "Network", status = "warning", solidHeader = TRUE, collapsible = TRUE,
visNetworkOutput("network_proxy", height = 700)
)
)
)#end ui
Вот код для сервера;
server <- function(input, output) {
output$network_proxy <- renderVisNetwork({
visNetwork(my.nodes, my.edges, height = "100%")
})
output$searchString <- renderText({
if (input$searchButton == 0)
return()
isolate({input$searchString})
})
} #end server
Ответ №1:
Вы можете сделать это с помощью visNetworkProxy
и visSelectNodes
, например, вот так, с помощью простого grepl
:
nodes <- data.frame(id = 1:3, label = c("A", "B", "A"))
edges <- data.frame(from = c(1,2), to = c(1,3))
require(visNetwork)
require(shiny)
require(shinydashboard)
ui <- dashboardPage(skin = "black",
dashboardHeader(),
dashboardSidebar(
sidebarMenu(
menuItem("Network", tabName = "network", icon = icon("dashboard")),
sidebarSearchForm(textId = "searchText", buttonId = "searchButton", label = "Search...")
)
),
dashboardBody(
box(
title = "Network", status = "warning", solidHeader = TRUE, collapsible = TRUE,
visNetworkOutput("network_proxy", height = 700)
)
)
)
server <- function(input, output, session) {
output$network_proxy <- renderVisNetwork({
visNetwork(nodes, edges, height = "100%")
})
observe({
if(input$searchButton > 0){
isolate({
print(input$searchText)
current_node <- nodes[grep(input$searchText, nodes$label), "id"]
print(current_node)
visNetworkProxy("network_proxy") %>% visSelectNodes(id = current_node)
})
}
})
} #end server
shiny::shinyApp(ui, server)
Комментарии:
1. Спасибо. Я пробовал это, но строка поиска по-прежнему ничего не возвращает.
2. Если вы используете searchButton, вам нужно нажать на значок, чтобы включить изменение
3. Спасибо. Когда я нажимаю на нее, она выбирает все узлы в сети.
4. Глупая ошибка с моей стороны. Мне нужно было использовать правильный фрейм данных с моими сетевыми данными. Также я сделал его нечувствительным к регистру и точным совпадением с:Кроме того, я использовал оператор which, чтобы получить точное совпадение: current_node <- network $ x $nodes[which(network $ x $ nodes $ id == input $ searchText), «label»]. Еще раз спасибо!
5. Я попытался отредактировать свой комментарий, но не смог этого сделать… Ваше решение сработало… Я смог получить точное совпадение без учета регистра с помощью:
find_me <- paste0("^",input$searchText,"$")
и затемcurrent_node <- network$x$nodes[grep(find_me, network$x$nodes$id, ignore.case = T), "label"]
. Еще раз спасибо.
Ответ №2:
Вы проверили это:
http://datastorm-open.github.io/visNetwork/shiny.html
Проверьте visNetworkProxy
раздел.
Кроме того, демонстрационный код, прилагаемый к пакету, содержит то, чего вы хотите достичь.
Комментарии:
1. Привет, спасибо. Я посмотрел на это. Я реализовал параметры nodesIdSelection и SelectedBy. Но я не вижу, как создать панель поиска, в которой пользователь может ввести имя узла.
Ответ №3:
Приведенный выше код из bthieurmel можно изменить на приведенный ниже, чтобы включить поиск без учета регистра:
current_node <- nodes[grep(input$searchText, nodes$label, ignore.case = T), "id"]