Могу ли я включить несколько элементов пользовательского интерфейса в один модуль Shinydashboard? - PullRequest
2 голосов
/ 23 марта 2020

В есть удивительное удобство помещения s в menuItem(menuSubItems()) часть dashboardSidebar(). Но я хочу, чтобы несколько элементов моего пользовательского интерфейса и сервера были закодированы в модули, чтобы я мог придерживаться структуры ... и я не вижу четкого способа сделать это без создания нескольких функций пользовательского интерфейса один модуль. Я видел shinydashboard golem пример на github, и это слишком простой пример, который не помогает.

Например, есть ли способ сделать это?

В модульном формате:

 library(shiny)
 library(shinydashboard)

 ###   The Sidebar Menu with a Widget Subitem
 mod_myAppSidebar_ui<-function(id) {
      ns <- NS(id)
      tagList(menuItem("Attributes", tabName="ourdata",
               textInput("textSearch","SQL Search String", value = "")))
 }

 ###   The Dashboard Body output
 mod_myAppBody_ui<-function(id) {
      ns <- NS(id)
      tagList(box(shiny::dataTableOutput(outputId = "OutputData")))
 }

 mod_myApp_server<-function(input, output, session) {
        ns <- session$ns
        output$OutputData<-shiny::renderDataTable({
              somedata=data.frame(Rows=letters,Indexes=1:length(letters))
              somedata[grepl(tolower(input$textSearch),somedata$Rows),]
              })
 }

 ###   DashboardPage requires separate arguments for the UI elements
 ui <- dashboardPage(header = dashboardHeader(title = "Rosetta"),
                     sidebar = dashboardSidebar(mod_myAppSidebar_ui("MySearch")),
                     body = dashboardBody(mod_myAppBody_ui("MySearch")))

 server <- function(input, output, session) {
           callModule(mod_myApp_server, "MySearch")
 }

 shinyApp(ui,server)

Есть ли способ заставить работать подобные вещи? Виджет не отображается, вероятно потому, что я не думаю, что модульная структура позволяет мне создавать два разных элемента пользовательского интерфейса для одной функциональности.

1 Ответ

0 голосов
/ 24 марта 2020

Хорошо, я получил это на работу ... на удивление не потребовалось слишком много. Я не знаю, сломит ли это сложность моего приложения, но для тех, кто надеялся сделать это, может быть, это полезно:

library(shiny)
library(shinydashboard)
library(DT)

mod_myAppSidebar_ui<-function(id) {
  ns <- NS(id)
  tagList(menuItem("Attributes", tabName="ourdata",
                   textInput(ns("textSearch"),"SQL Search String", value = ""),
                   actionButton(ns("go"),label = "Search")))
}

mod_myAppBody_ui<-function(id) {
  ns <- NS(id)
  tagList(fluidRow(title = "Data Selected",
                   box(DT::dataTableOutput(outputId = ns("OutputData")))))
}

mod_myApp_server<-function(input, output, session, r) {
  ns <- session$ns

  observeEvent( input$go , {
    r$textSearch<-input$textSearch
    print(r$textSearch)
    somedata=data.frame(Rows=letters,Indexes=1:length(letters))
    r$chooseData<-somedata[grepl(tolower(input$textSearch),somedata$Rows),]
  })

  output$OutputData<-DT::renderDataTable(r$chooseData)

}

ui <- dashboardPage(header = dashboardHeader(title = "Rosetta"),
                    sidebar = dashboardSidebar(mod_myAppSidebar_ui("MySearch")),
                    body = dashboardBody(mod_myAppBody_ui("MySearch")))

server <- function(input, output, session) {
  r<-reactiveValues()
  callModule(mod_myApp_server, "MySearch", r)
}

shinyApp(ui,server)
...