Создание вкладок с именем, выбранным из выбранной функции ввода в блестящем - PullRequest
0 голосов
/ 07 мая 2019

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

 library(shiny)
 ui <- (fluidPage(
  titlePanel("Demonstration of renderUI in shiny - Dymanically creating      the tabs based on user inputs"),
  sidebarLayout(
    sidebarPanel(
      # Numeric input to enter the number of tabs needed
      numericInput("n", 'Enter the number of tabs needed', 1)

    ),
    mainPanel(
     uiOutput('tabs')
   )
 )
   ))


server <- (function(input,output){

  output$tabs = renderUI({
Tabs <- lapply(paste("tab no.", 1:input$n, sep=" "), tabPanel)
do.call(tabsetPanel, Tabs)
  })
 })
 shinyApp(ui, server)

Здесь вкладки увеличиваются в соответствии с увеличенными числами иуменьшено, у меня есть раскрывающееся меню, в котором будут показаны кортежи моей таблицы базы данных, как показано здесь

| name                 |
+----------------------+
| aaa                  |     
| kart                 |     

, и вот мой код с ошибкой:

    library("shiny")
   library("shinydashboard")
   library("pool")
  library("DBI")
  pool <- dbPool(drv = RMySQL::MySQL(),dbname = "demo",host =    "db.cr7dht.us-east-2.rds.amazonaws.com",username = "kak",password =    "1278", port = 3306)
  mychoices = dbGetQuery(pool,"select available_scenario from sc;")
  ui <- (fluidPage(
    titlePanel("Demonstration of renderUI in shiny - Dymanically creating    the       tabs based on user inputs"),
    sidebarLayout(
      sidebarPanel(
       selectInput('n', "available scenarios", choices = mychoices,    multiple      = TRUE),
        verbatimTextOutput("selected")

   ),
   mainPanel(
      uiOutput('tabs')
   )
  )
))
 server <- (function(input,output,session){
  output$tabs = renderUI({
    observe({
    updateSelectInput(
    session, "n", choices = mychoices
  )
})
Tabs <- lapply(paste("tab name", 1:input$choices, sep=" "), tabPanel)
do.call(tabsetPanel, Tabs)

  })
})
shinyApp(ui, server)

1 Ответ

0 голосов
/ 07 мая 2019

Прежде всего, вам не нужна табуляция, если n равно NULL, поэтому я добавил проверку is.null.Во-вторых, удалите 1: при создании вкладок.функция вставки автоматически преобразует ваш inpu$n в строку из нескольких символов.Не нужно вводить диапазон.

Кроме того, вам не нужно указывать updateSelectInput в вашей функции renderUI.

Рабочий пример

mychoices = 1:10
ui <- (fluidPage(
  titlePanel("Demonstration of renderUI in shiny - Dymanically creating    the       tabs based on user inputs"),
  sidebarLayout(
    sidebarPanel(
      selectInput('n', "available scenarios", choices =    mychoices,    multiple      = TRUE),
      verbatimTextOutput("selected")),
    mainPanel(
      uiOutput('tabs')
    )
  )
))

server <- (function(input,output,session){
  output$tabs = renderUI({
    if(!is.null(input$n)){
      Tabs <- lapply(paste("tab name", input$n, sep=" "), tabPanel)
      do.call(tabsetPanel, Tabs)}

  })
})
...