R Shiny - Использование req () с isolate () - PullRequest
1 голос
/ 22 марта 2020

Приложение ниже содержит два selectInput s, letter и state (содержит сокращенные названия штатов США). Существует также uiOutput, который отображает полное название штата input$state ниже состояния selectInput. Вот так:

enter image description here

Мне бы хотелось, чтобы полное имя штата отображалось только в случае input$letter == b. Для этого я добавляю следующее в мой renderUI вызов: req(isolate(input$letter) == 'b'). Однако это приводит к тому, что renderUI никогда больше не будет выполняться, даже если пользователь изменит input$state и input$letter == b. Ничего не отображается:

enter image description here

На приведенном выше снимке экрана я ожидал, что текст 'имя штата: Калифорния' будет отображаться, поскольку renderUI по-прежнему принимает зависимость от значения 'state', так что изменение в input$state должно привести к повторному выполнению выражения в renderUI. Так почему же выделение значения буква с помощью isolate(input$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)])

    })
  }
)

1 Ответ

1 голос
/ 22 марта 2020

Почему вы даже выделяете входную букву $? Обычный 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
    })

  }
)
...