Множественное условие в блестящей панели мониторинга

#r #shiny

#r #блестящий

Вопрос:

Ниже приведен пример, но в данной ситуации мне нужно передать много условий, и я не хочу использовать оператор if. Есть ли какой-либо другой способ без использования, если я могу выполнить работу.

Код

 
library(shiny)

ui = fluidPage(
  selectInput('p_id','ID:', c(111,222,333)),
  uiOutput('uiID')
)

server = function(input, output, session) {

  maxdays <- reactive({
    if(input$p_id %in% c(111)){
      x = 1
    }else{
      if(input$p_id %in% c(222)){
        x = 2
      }else
        x = 3 
    }
    return(x)
  })


  output$uiID <- renderUI({
    selectInput('days','Days:', choices=seq(1,maxdays()))
  })


}

runApp(shinyApp(ui = ui, server = server))

  

Комментарии:

1. v <- c(111,222,333); which(v==111); which(v==222)

2. ваш пример действительно работает. Это не лучший способ написать оператор if else, но все же. Почему вы не хотите использовать оператор if?

3. @Уилмар ван Оммерен . Моя нынешняя ситуация такова, что если я использую условие if, то мне нужно написать около 700 условий if, тогда только я могу получить точный результат. Чего я не хочу делать, поскольку чувствую, что это неправильный подход. Если у вас есть какие-либо предложения, пожалуйста, дайте мне знать.

Ответ №1:

Предполагая, что это maxdays в основном возвращает позицию вашего selectInput выбора, вы могли бы сделать следующее:

 library(shiny)

my_choices <- c(111, 222, 333)

ui <- fluidPage(
  selectInput('p_id', 'ID:', my_choices),
  uiOutput('uiID')
)

server <- function(input, output, session) {
  maxdays <- reactive(which(my_choices %in% input$p_id))

  output$uiID <- renderUI({
    selectInput('days', 'Days:', choices = seq(1,maxdays()))
  })
}

shinyApp(ui, server)
  

Ответ №2:

Лучше не создавать объекты постоянно с помощью renderUI , вместо этого мы можем просто обновить виджет:

 library(shiny)

data <- c(111,222,333)
ui <- fluidPage(
  selectInput('p_id','ID:', data),
  selectInput('days','Days:', choices = NULL)
)

server = function(input, output, session) {

  observeEvent(input$p_id,{
    mseq <- seq(1,which(data %in% input$p_id))
    updateSelectInput(session,"days","Days:",choices = mseq)
  })

}
runApp(shinyApp(ui = ui, server = server))
  

введите описание изображения здесь