Я разрабатываю приложение на основе R Shiny.
Я хочу, чтобы мой ввод соответствовал доступным данным, поэтому я обновляю выбранные значения в selectInput.
Когда я изменяю выбранное значение на входе 1, то значение на входе 2 обновляется, затем данные обновляются (только один раз). Хорошо
НО, если я изменю выбранное значение на входе 2, тогда данные обновляются, затем значение на входе 1 обновляется, а затем данные обновляются СНОВА.
Проверьте "check latest_value", который напечатан дважды.
Изначально я использовал renderUI, а не updateSelectInput, но при инициализации данные вычисляются дважды.
library(shiny)
library(DT)
library(dplyr)
my_data=data.frame(CO2)
# Running a Shiny app object
app <- shinyApp(
ui = bootstrapPage(
selectInput('type','Choix du type',choices = unique(my_data$Type)),
uiOutput('plant_ui'),
DTOutput('plot')
),
server = function(input, output) {
data=reactive({
# req(input$type)
my_data_temp=my_data
if(length(input$type)>0){
my_data_temp=my_data_temp%>%filter(Type%in%input$type)
}
if(length(input$plant)>0){
my_data_temp=my_data_temp%>%filter(Plant%in%input$plant)
}
my_data_temp
})
latest_plant_value=reactive({
if(is.null(input$plant))data()$Plant[1]
else input$plant
})
output$plant_ui=renderUI({
sub_data=data()
selectInput(inputId = 'plant',"filtre par plant",choices = unique(sub_data$Plant),
selected=latest_plant_value())
})
output$plot <- renderDT({
print("check latest_value")
datatable(data()) })
}
)
runApp(app)
Именно поэтому я решил использовать updateSelectInput на основе этого Альтернативное управление sliderInput между производным значением и выбранным пользователем значением , но последовательная структура кода делает данные для вычисления дважды при изменении ввода 2 значения.
library(shiny)
library(DT)
library(dplyr)
my_data=data.frame(CO2)
# Running a Shiny app object
app <- shinyApp(
ui = bootstrapPage(
selectInput('type','Choix du type',choices = unique(my_data$Type),selected=my_data$Type[1]),
selectInput('plant','Choix du type',choices = unique(my_data$Plant),selected=my_data$Plant[1]),
DTOutput('plot')
),
server = function(input, output,session) {
data=reactive({
# req(input$type)
my_data_temp=my_data
if(length(input$type)>0){
my_data_temp=my_data_temp%>%filter(Type%in%input$type)
}
if(length(input$plant)>0){
my_data_temp=my_data_temp%>%filter(Plant%in%input$plant)
}
my_data_temp
})
observeEvent(input$type,{
print("update type changed")
updateSelectInput(session, "plant",
selected = unique(my_data%>%filter(Type%in%input$type)%>%.$Plant)[1])
})
observeEvent(input$plant,{
print("update plant changed")
updateSelectInput(session, "type",
selected = unique(my_data%>%filter(Plant%in%input$plant)%>%.$Type)[1])
})
output$plot <- renderDT({
print("check latest_value")
datatable(data()) })
}
)
runApp(app)
Исправления, подобные этой, в этом случае не работают, потому что я не пытаюсь достичь того же самого три взаимозависимых selectInput в приложении R / Shiny
Я хочу, чтобы выбранное по умолчанию значение каждого входа было согласованным, чтобы фильтр возвращал хотя бы 1 значение. Это любой ввод, который я изменяю.