Друзья, почему-то мне пришлось рендерить пользовательский интерфейс динамически (разные графические интерфейсы для разных пользователей) и столкнулся с проблемой, которую я почему-то не могу преодолеть, несмотря ни на что.Пробовал изолировать, реактивность, обновления и все мне не удавалось.Возможно, у вас есть какая-то идея, как ее решить (или у вас может сложиться мнение, что пытаться вставить его в рендеринг пользовательского интерфейса абсолютно глупо - надеюсь, не потому, что это уже массовое приложение).Итак, сначала пример, который работает без каких-либо проблем (размытое представление проблемы, а не реальное приложение)
library(shiny)
library(magrittr)
library(dplyr)
ui <- fluidPage(
selectInput("cyl","cyl",unique(mtcars$cyl)),
selectInput("mpg","mpg","")
)
server <- function(input, output, session) {
mpg<- reactive({unique(mtcars%>%dplyr::filter(cyl==input$cyl)%>%select(mpg))})
observeEvent(input$cyl,{updateSelectInput(session,"mpg", choices = mpg())})
}
shinyApp(ui = ui, server = server)
Работает без сбоев, вы обновляете верхний список, а он сужает нижний, нов случае рендеринга пользовательского интерфейса изменение первого списка приводит к обновлению всего пользовательского интерфейса и, следовательно, меняет верхний список на первую позицию в вариантах, отменяя ваш выбор
library(shiny)
library(magrittr)
library(dplyr)
ui <- uiOutput("myUI")
server <- function(input, output, session) {
output$myUI<-renderUI({
fluidPage(
selectInput("cyl","cyl",unique(mtcars$cyl)),
selectInput("mpg","mpg",mpg()))
})
mpg<- reactive({
if(!is.null(input$cyl))
unique(mtcars%>%dplyr::filter(cyl==input$cyl)%>%select(mpg))
})
}
shinyApp(ui = ui, server = server)
Как можно предотвратить восстановление всего пользовательского интерфейса?В этом тривиальном примере это сводится к 2 входам, но в приложении это большая листовка, которая должна быть обновлена путем изменения любого из нескольких входов - довольно сложно сохранить ранее выбранные значения и повторно выбрать их после обновления, но, возможно,это единственный способ