Предотвратить renderUI от обновления всех входных данных - PullRequest
0 голосов
/ 24 сентября 2018

Друзья, почему-то мне пришлось рендерить пользовательский интерфейс динамически (разные графические интерфейсы для разных пользователей) и столкнулся с проблемой, которую я почему-то не могу преодолеть, несмотря ни на что.Пробовал изолировать, реактивность, обновления и все мне не удавалось.Возможно, у вас есть какая-то идея, как ее решить (или у вас может сложиться мнение, что пытаться вставить его в рендеринг пользовательского интерфейса абсолютно глупо - надеюсь, не потому, что это уже массовое приложение).Итак, сначала пример, который работает без каких-либо проблем (размытое представление проблемы, а не реальное приложение)

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 входам, но в приложении это большая листовка, которая должна быть обновлена ​​путем изменения любого из нескольких входов - довольно сложно сохранить ранее выбранные значения и повторно выбрать их после обновления, но, возможно,это единственный способ

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Извините, что беспокою вас, но это было слишком легко, я должен был это сразу заметить. Я могу просто визуализировать пользовательский интерфейс внутри пользовательского интерфейса, как

library(shiny)
library(magrittr)
library(dplyr)

ui <- uiOutput("myUI")

server <- function(input, output, session) {
  output$myUI<-renderUI({
    fluidPage(
      selectInput("cyl","cyl",unique(mtcars$cyl)),
      uiOutput("xmpg")
      )
  })

  output$xmpg<-renderUI({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)

, тогда любые вызовы не перерисовывают пользовательский интерфейс верхнего уровня, простопользовательский интерфейс

0 голосов
/ 24 сентября 2018

Во втором случае вы получили круговую логику реактивности в результате ui <- uiOutput("myUI").По сути, пользовательский интерфейс создается заново всякий раз, когда пользовательский интерфейс обновляется.Вот как в этом случае можно использовать renderUI -

library(shiny)
library(magrittr)
library(dplyr)

ui <- fluidPage(
  selectInput("cyl","cyl",unique(mtcars$cyl)),
  uiOutput("select_mpg")
)

server <- function(input, output, session) {
  mpg <- reactive({
    req(input$cyl)
    m <- mtcars %>% dplyr::filter(cyl == input$cyl)
    unique(m$mpg)
  })

  output$select_mpg <- renderUI({
    selectInput("mpg","mpg",mpg())
  })
}
shinyApp(ui = ui, server = server)

Обратите внимание, что я сделал некоторые другие изменения, чтобы приложение работало правильно и сделал код более читабельным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...