#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, а затем начинать, если снова. Чем ты