如何在闪亮的网络应用程序中结合 navlistPanel 和 sidebartLayout
How to combine a navlistPanel with sidebartLayout in a shiny web app
我正在尝试将 navlistPanel 与 sidebartLayout 结合到一个闪亮的网络应用程序中。这个想法是让应用程序看起来像这样:
但是,当 运行 应用程序时,它不会接收在 server.R 中创建的数据和对象,也不会接收图表或table 显示在应用程序中。此外,conditionalPanel 和 actionButton 都不起作用。
我有 运行 没有将 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 grafica
和 tabla
中有重复的 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)
我正在尝试将 navlistPanel 与 sidebartLayout 结合到一个闪亮的网络应用程序中。这个想法是让应用程序看起来像这样:
但是,当 运行 应用程序时,它不会接收在 server.R 中创建的数据和对象,也不会接收图表或table 显示在应用程序中。此外,conditionalPanel 和 actionButton 都不起作用。
我有 运行 没有将 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 grafica
和 tabla
中有重复的 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)