【问题标题】:R Shiny - Using req() with isolate()R Shiny - 将 req() 与 isolate() 一起使用
【发布时间】:2020-07-03 00:01:39
【问题描述】:

下面的应用程序包含两个selectInputs、letterstate(包含美国各州的缩写名称)。还有一个uiOutput,在状态selectInput下方显示状态input$state的全称。像这样:

我希望仅当input$letter == b 时才显示州的全名。为此,我在renderUI 调用中添加以下内容:req(isolate(input$letter) == 'b')。但是,这会导致renderUI 永远不会重新执行,即使用户更改了input$stateinput$letter == b。没有渲染:

在上面的屏幕截图中,我预计会显示文本“州名:加利福尼亚”,因为 renderUI 仍然依赖于“州”的值,因此 input$state 的更改应该会导致renderUI 中的表达式重新执行。那么,为什么通过isolate(input$letter) 隔离 letter 的值会改变这种行为呢?

这是重现上述内容的代码:

library(shiny)

shinyApp(
  ui = fluidPage(
    selectInput('letter', 'letter', letters),
    selectInput('state', 'state abbreviation', state.abb),
    uiOutput('state_full')
  ),
  server = function(input, output, session) {

    output$state_full <- renderUI({

      # req(isolate(input$letter) == 'b')

      paste('state name:', state.name[which(state.abb == input$state)])

    })
  }
)

【问题讨论】:

    标签: r shiny rstudio


    【解决方案1】:

    为什么还要隔离 input$letter?常规的 ifelse() 应该可以正常工作吗?

    library(shiny)
    
    letters <- c("a", "b")
    state.abb <- c("AL", "CA")
    state.name <- c("Alabama", "California")
    
    shinyApp(
      ui = fluidPage(
        selectInput('letter', 'letter', letters),
        selectInput('state', 'state abbreviation', state.abb),
        uiOutput('state_full1'),
        uiOutput('state_full2'),
        uiOutput('state_full3')
      ),
      server = function(input, output, session) {
    
        output$state_full1 <- renderUI({
          out <- ifelse(isolate(input$letter) == 'b',
                        paste('state name 1:', state.name[which(state.abb == input$state)]),
                        '')
          out
        })
    
        output$state_full2 <- renderUI({
          out <- dplyr::if_else(isolate(input$letter) == 'b',
                                paste('STATE NAME 2:', state.name[which(state.abb == input$state)]),
                                '')
          out
        })
    
        output$state_full3 <- renderUI({
          input$state
          out <- ifelse(isolate(input$letter) == 'b',
                        paste('state name 3:', state.name[which(state.abb == input$state)]),
                        '')
          out
        })
    
      }
    )
    

    【讨论】:

    • 是的,我知道我可以使用 if-else,但我帖子中的示例只是为了说明我的问题。
    • 嗯,我明白你的意思了。有趣的是,一旦调用了一个隔离,表达式就不会计算。但是,这并不总是正确的,请参阅 dplyr 中的 if_else。尽管我无法准确解释为什么在这些情况下行为不同,但我会将其保留为解决方案
    • 干杯,我希望有人能对此有所了解。我已经查阅了req 的文档,但无济于事。
    猜你喜欢
    • 2018-11-18
    • 2021-04-16
    • 2014-11-06
    • 2022-12-29
    • 2017-01-25
    • 1970-01-01
    • 2021-05-20
    • 2021-10-29
    • 2020-07-25
    相关资源
    最近更新 更多