如何在闪亮的网络应用程序中结合 navlistPanel 和 sidebartLayout

How to combine a navlistPanel with sidebartLayout in a shiny web app

我正在尝试将 navlistPanelsidebartLayout 结合到一个闪亮的网络应用程序中。这个想法是让应用程序看起来像这样:

但是,当 运行 应用程序时,它不会接收在 server.R 中创建的数据和对象,也不会接收图表或table 显示在应用程序中。此外,conditionalPanelactionButton 都不起作用。

我有 运行 没有将 sidebarLayout 放入 navlistePanel 的代码(只有 运行 将代码与 sidebarLayout 结合在一起)并且它工作得很好。当 运行 在 navlistPanel.

中设置 sidebarLayout 时,问题就来了

¿知道为什么会这样吗?

这是代码(我使用它分为 3 个脚本:全局、ui 和服务器)。

# global.R <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
library(shiny)
library(tidyverse)
library(DT)

data <- airquality
meses <- unique(airquality$Month)
variables <- colnames(airquality)[-c(5,6)]
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
shinyUI(

  fluidPage(

    navlistPanel("Panel de navegación",

                 tabPanel("General",

                          sidebarLayout(
                            
                            sidebarPanel(
                              
                              selectInput(inputId = "mes", label = "Selecciona un mes", choices = meses),
                              selectInput(inputId = "var", label = "Selecciona la variable Y", choices = variables),
                              checkboxInput(inputId = "cambiarTitulo", label = "Escribe un título", value = F),
                              conditionalPanel(condition = "input.cambiarTitulo == true",
                                               textInput(inputId = "titulo", label = "Escribe un título para la agráfica",
                                                         placeholder = "Tu título va aquí")),
                              actionButton(inputId = "boton", label = "Refrescar")
                            ),
                            
                            mainPanel(
                              
                              tabsetPanel(
                                
                                tabPanel(title = "Gráfica", plotOutput("grafica")),
                                tabPanel(title = "Datos", dataTableOutput("tabla"))
                              )
                            )
                          )
                 ),

                 tabPanel("Gráfica", plotOutput("grafica")),
                 tabPanel("Datos", DTOutput("tabla"))
    )
  )
)
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
shinyServer(function(input, output) {
    
    datosFiltrados <- reactive({
        datosNuevos <- data %>% filter(Month == input$mes)
        return(datosNuevos)
    })
    
    output$tabla <- renderDT(
        datatable(datosFiltrados(),
                  options = list(pageLenth = 10,
                                 lengthMenu = c(10,20)))
    )
    
    grafica <- eventReactive(input$boton, {
        
        if (input$cambiarTitulo == T) {
            ggplot(datosFiltrados()) +
                geom_point(aes_string(x = "Day", y = input$var)) +
                ggtitle(input$titulo)
        } else {
            ggplot(datosFiltrados()) +
                geom_point(aes_string(x = "Day", y = input$var))
        }
        
    })
    
    output$grafica <- renderPlot(grafica())
    
})

您在 UI graficatabla 中有重复的 ID。闪亮不允许 ID 重复。

如果您需要让 2 个组件在 shiny 中呈现相同的东西,您仍然需要为每个组件设置唯一的 ID,并仔细观察我是如何在服务器中进行复制的。

# global.R <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
library(shiny)
library(tidyverse)
library(DT)

data <- airquality
meses <- unique(airquality$Month)
variables <- colnames(airquality)[-c(5,6)]
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
ui <- fluidPage(
    navlistPanel("Panel de navegación",
                 
                 tabPanel("General",
                          
                          sidebarLayout(
                              
                              sidebarPanel(
                                  
                                  selectInput(inputId = "mes", label = "Selecciona un mes", choices = meses),
                                  selectInput(inputId = "var", label = "Selecciona la variable Y", choices = variables),
                                  checkboxInput(inputId = "cambiarTitulo", label = "Escribe un título", value = F),
                                  conditionalPanel(condition = "input.cambiarTitulo === true",
                                                   textInput(inputId = "titulo", label = "Escribe un título para la agráfica",
                                                             placeholder = "Tu título va aquí")),
                                  actionButton(inputId = "boton", label = "Refrescar")
                              ),
                              
                              mainPanel(
                                  
                                  tabsetPanel(
                                      
                                      tabPanel(title = "Gráfica", plotOutput("grafica")),
                                      tabPanel(title = "Datos", dataTableOutput("tabla"))
                                  )
                              )
                          )
                 ),
                 
                 tabPanel("Gráfica", plotOutput("grafica2")),
                 tabPanel("Datos", DTOutput("tabla2"))
    )
)
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
server <- function(input, output, session) {
    
    datosFiltrados <- reactive({
        datosNuevos <- data %>% filter(Month == input$mes)
        return(datosNuevos)
    })
    
    output$tabla <- output$tabla2 <- renderDT(
        datatable(datosFiltrados(),
                  options = list(pageLenth = 10,
                                 lengthMenu = c(10,20)))
    )
    
    grafica <- eventReactive(input$boton, {
        
        if (input$cambiarTitulo == T) {
            ggplot(datosFiltrados()) +
                geom_point(aes_string(x = "Day", y = input$var)) +
                ggtitle(input$titulo)
        } else {
            ggplot(datosFiltrados()) +
                geom_point(aes_string(x = "Day", y = input$var))
        }
        
    })
    
    output$grafica <- output$grafica2 <- renderPlot(grafica())
    
}

shinyApp(ui, server)