#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))