Tenho o shiny
aplicativo abaixo em que o subconjunto inicial acontece a partir da 1ª entrada com os nomes. Então os valores disponíveis deverão passar para as outras quatro entradas e para a tabela.
Quero que os valores das outras 4 entradas sejam atualizados com base na escolha da primeira, mas também quando, por exemplo, eu selecionar o valor mínimo ou máximo, as datas mínima e máxima serão subdefinidas e vice-versa.
Apenas a 1ª entrada deve manter sempre a mesma quantidade de todos os nomes.
library(shiny)
library(shinydashboard)
library(shinyWidgets)
# Load necessary libraries
library(DT)
# Creating a sample dataframe
set.seed(123)
dates <- seq(as.Date("2023-01-01"), as.Date("2023-12-31"), by = "days")
numeric_values <- sample(1:100, length(dates), replace = TRUE)
names <- rep(c("Alice", "Bob", "Charlie"), length.out = length(dates))
df <- data.frame(Date = dates, Numeric = numeric_values, Name = names)
# Define UI
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
pickerInput("namePicker", "Select Name:", choices = unique(df$Name),selected = unique(df$Name)[1], multiple = TRUE),
uiOutput("numeric1"),
uiOutput("numeric2"),
uiOutput("date1"),
uiOutput("date2")
),
mainPanel(
DTOutput("table")
)
)
)
# Define server logic
server <- function(input, output, session) {
# Filter data based on selected names
filtered_data <- reactive({
req(input$namePicker)
df_subset <- df[df$Name %in% input$namePicker, ]
return(df_subset)
})
# Render the filtered data table
output$table <- renderDT({
datatable(filtered_data(), options = list(pageLength = 10)) # Customize datatable appearance if needed
})
# Render numeric range inputs dynamically
output$numeric1 <- renderUI({
numericInput("minNumeric", "Min Numeric Value:", min = min(df$Numeric), max = max(df$Numeric), value = min(df$Numeric))
})
output$numeric2 <- renderUI({
numericInput("maxNumeric", "Max Numeric Value:", min = min(df$Numeric), max = max(df$Numeric), value = max(df$Numeric))
})
# Render date range inputs dynamically
output$date1 <- renderUI({
dateInput("minDate", "Min Date:", min = min(df$Date), max = max(df$Date), value = min(df$Date))
})
output$date2 <- renderUI({
dateInput("maxDate", "Max Date:", min = min(df$Date), max = max(df$Date), value = max(df$Date))
})
}
# Run the application
shinyApp(ui = ui, server = server)
verifique a solução abaixo.
Simplifiquei um pouco o seu servidor, não é uma maneira eficiente de criar entradas no servidor e chamar uioutput na parte da UI, você pode escrever diretamente na UI ou apenas criar um valor de renderização para todas as entradas da UI.
E também se você deseja atualizar suas 4 entradas dependendo da entrada do namePicker, então você precisa especificar como NULL para valores e irá atualizá-los no servidor
Usei dois observeEvent no Server, primeiro: para atualizar as entradas minnumeric e maxnumeric de acordo com o que você escolher para pickerName, e segundo: pelo que entendi corretamente mindate e maxdate de acordo com qual outra variável foi escolhida. conforme você vê o que escolheu no nome do seletor, ele atualizará automaticamente os valores de entrada
Espero que esta solução o ajude em seu projeto, caso tenha alguma dúvida entre em contato.
DR Todas as entradas influenciam umas às outras, o que foi feito dependendo
oberve
dos dados filtrados finais. Existem dois conjuntos de dados filtrados, um de inicialização e outro conectado com entradas numéricas/data. A atualização das entradas é desativada quando a seleção está vazia (com if).Quando descubro essa questão, o primeiro tópico conectado é a Filtragem Hierárquica como estratégia alternativa para filtros/seleções dependentes.
Criado em 31/12/2023 com reprex v2.0.2