【问题标题】:Prevent renderUI from updating all inputs防止 renderUI 更新所有输入
【发布时间】: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


    【解决方案1】:

    在第二种情况下,由于ui &lt;- uiOutput("myUI"),您最终得到了循环反应逻辑。基本上,每当 UI 更新时,都会重新生成 UI。以下是在这种情况下如何使用 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)
    

    请注意,我已经进行了一些其他更改以使应用程序正常运行并使代码更具可读性。

    【讨论】:

    • 谢谢,但这不是答案,您基本上重复了我在第一个示例中写的内容。如果您将其保留在 ui 部分中,任何事情都会起作用,问题是如果您像第二个示例中那样将整个 ui 渲染移动到服务器,如何使其正常工作
    【解决方案2】:

    很抱歉打扰您,但它太容易了,应该立即发现它 我可以像在 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)),
          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)
    

    那么任何调用都不会重新渲染顶级 ui,只是有问题的 ui

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 2017-06-14
      • 2019-05-13
      相关资源
      最近更新 更多