Создание инструкций if в моей серверной части приложения shiny

#r #function #shiny

#r #функция #блестящий

Вопрос:

надеюсь, вы могли бы помочь мне с моим приложением Shiny в R. Я новичок в Shiny и мне понадобится помощь в упрощении моей серверной части.

Я пытаюсь отобразить таблицы на основе двух входных данных, один из которых является входом больницы, а второй — типом запрашиваемой таблицы. Я сделал несколько операторов if, чтобы получить нужную таблицу, но код кажется сложным и может быть упрощен.

В принципе, мне это нужно в зависимости от больницы и типа таблицы, чтобы блестящее приложение показывало таблицу без слишком длинного оператора if.

Есть ли кто-нибудь, кто мог бы помочь мне с приведенным ниже кодом, чтобы сделать его более простым.

 library(shiny) library(tidyverse)    UCSF lt;- list( ndc_ucsf_v2, brand_n_v2, ndc_tier2_ucsf_v2, ndc_tier5_ucsf_v2, ucsf_ldd_list_v2,  brand_n_class_ucsf_v2, ndc_rest_of_tiers_ucsf_v2)  hospital_list lt;- c("UCSF", "VIDANTHEALTH", "CONH", "ERLR", "OSURX", "SUTTHEALTH",  "UHC", "WHT") table_list lt;- c("By NDC", "By brand name", "By GPI class", "By tier 2", "By tier 5", "Other tiers",  "LDD", "By hierarchy") ui lt;- fluidPage(  titlePanel("Hospital rebate claims"),   # Sidebar with a slider input for number of bins   sidebarLayout(  sidebarPanel(  selectInput(inputId = "hospital",   label = "Hostpital/clinic",   choices = c("Choose hospital", hospital_list),  multiple = FALSE),  selectInput(inputId = "table_type",   label = "Type of analysis",  multiple = FALSE, choices = table_list)),  mainPanel(  tableOutput(outputId = "claimtable"),  plotOutput(outputId = "hist") )))  server lt;- function(input, output) {  output$claimtable lt;- renderTable({  if(input$hospital == "UCSF" amp; input$table_type == "By NDC"){  output$claimtable lt;- return(UCSF[[1]])  }   if(input$hospital == "UCSF" amp; input$table_type == "By brand name") {  output$claimtable lt;- return(UCSF[[2]])  }  if(input$hospital == "UCSF" amp; input$table_type == "By tier 2") {  output$claimtable lt;- return(UCSF[[3]])  }  if(input$hospital == "UCSF" amp; input$table_type == "By tier 5") {  output$claimtable lt;- return(UCSF[[4]])  }  if(input$hospital == "UCSF" amp; input$table_type == "LDD") {  output$claimtable lt;- return(UCSF[[5]])  }  if(input$hospital == "UCSF" amp; input$table_type == "By GPI class") {  output$claimtable lt;- return(UCSF[[6]])  }  if(input$hospital == "UCSF" amp; input$table_type == "Other tiers") {  output$claimtable lt;- return(UCSF[[7]])  }}) }  shinyApp(ui = ui, server = server)  

Ответ №1:

Вы могли бы использовать switch вместо повторения if команд:

 server lt;- function(input, output) {  output$claimtable lt;- renderTable({    if (input$hospital == "UCSF") {  switch (input$table_type,  "By NDC" = UCSF[[1]],  "By brand name" = UCSF[[2]],  "By tier 2" = UCSF[[3]],  "By tier 5" = UCSF[[4]],  "LDD" = UCSF[[5]],  "By GPI class" = UCSF[[6]],  "Other tiers" = UCSF[[7]],  )  } else {  # What happens here?   # You example doesn't show it  }    }  

В качестве альтернативы вы можете просто table_list правильно заказать свой и заменить на его основе:

 table_list lt;- c("By NDC", "By brand name", "By tier 2", "By tier 5",  "LDD", "By GPI class", "Other tiers", "By hierarchy")   server lt;- function(input, output) {  output$claimtable lt;- renderTable({    if (input$hospital == "UCSF") {  UCSF[[which(table_list == input$table_type)]]  } else {  # What happens here?   # You example doesn't show it  }    }  

Что же input$hospital меняется? Может быть, это меняет второй уровень списка?

 server lt;- function(input, output) {  output$claimtable lt;- renderTable({  UCSF[which(table_list == input$table_type)][which(hospital_list == input$hospital_list)]    }  

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

1. Привет, спасибо вам за анализатор, он работает, если у меня есть два варианта, к сожалению, он работает только в том случае, если у меня есть два варианта, мне нужно изменить приложение в зависимости, во-первых, от больницы в «selectInput = больница», а затем второй тип анализа.

2. @amer23 вы пробовали последний вариант? Он изменяется на основе обоих этих входных данных.

3. У меня была опечатка, и первое решение сработало, мне нужно заканчивать каждое утверждение if с помощью else, а затем начинать, если снова. Чем ты