【发布时间】:2018-09-23 21:27:07
【问题描述】:
朋友们, 出于某种原因,我必须以动态方式呈现 ui(不同用户的不同 GUI)并且遇到了一个无论如何我都无法克服的问题。尝试隔离、反应、更新,但都失败了。也许您对如何解决它有一些想法(或者您可能认为尝试将其放入渲染 ui 绝对是愚蠢的 - 希望不是因为它已经是大型应用程序)。所以首先是一个没有任何问题的示例(问题的淡化表示,而不是真正的应用程序)
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)
没有任何故障,您更新顶部列表并缩小底部列表 但是在渲染 ui 的情况下,第一个列表的更改会导致整个 ui 的更新,并因此将顶部列表更改为否定您选择的选项中的第一个位置
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)
如何防止整个 UI 重建?在这个简单的例子中,它被归结为 2 个输入,但在应用程序中,它是一个大的传单地图,应该通过更改为几个输入中的任何一个来更新 - 存储先前选择的值并在刷新后重新选择它们相当棘手,但也许这是唯一的方法
【问题讨论】:
标签: r shiny reactive-programming