在我闪亮的应用服务器部分制作 if 语句

Posted

技术标签:

【中文标题】在我闪亮的应用服务器部分制作 if 语句【英文标题】:Making if statements in my shiny app server part 【发布时间】:2022-01-13 16:07:16 【问题描述】:

希望您能帮助我在 R 中使用 Shiny 应用程序。我是 Shiny 的新手,需要一些帮助来简化我的后端部分。

我正在尝试基于两个输入呈现表格,一个是医院输入,第二个输入是请求的表格类型。为了得到我想要的表,我做了几个 if 语句,但代码似乎很复杂,可以简化。

基本上,我需要根据医院和表格类型为 Shiny 应用程序显示表格,而不需要太长的 if 语句。

有没有人可以帮助我编写下面的代码以使其更简单。

library(shiny)
library(tidyverse)



UCSF <- 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 <- c("UCSF", "VIDANTHEALTH", "CONH", "ERLR", "OSURX", "SUTTHEALTH",
                   "UHC", "WHT")
table_list <- c("By NDC", "By brand name", "By GPI class", "By tier 2", "By tier 5", "Other tiers",
                "LDD", "By hierarchy")
ui <- 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 <- function(input, output) 
      output$claimtable <- renderTable(
      if(input$hospital == "UCSF" & input$table_type == "By NDC")
        output$claimtable <- return(UCSF[[1]])
         
        if(input$hospital == "UCSF" & input$table_type == "By brand name") 
        output$claimtable <- return(UCSF[[2]])
        
        if(input$hospital == "UCSF" & input$table_type == "By tier 2") 
          output$claimtable <- return(UCSF[[3]])
        
        if(input$hospital == "UCSF" & input$table_type == "By tier 5") 
          output$claimtable <- return(UCSF[[4]])
        
        if(input$hospital == "UCSF" & input$table_type == "LDD") 
          output$claimtable <- return(UCSF[[5]])
        
        if(input$hospital == "UCSF" & input$table_type == "By GPI class") 
          output$claimtable <- return(UCSF[[6]])
        
        if(input$hospital == "UCSF" & input$table_type == "Other tiers") 
          output$claimtable <- return(UCSF[[7]])
        )


shinyApp(ui = ui, server = server)

【问题讨论】:

【参考方案1】:

您可以使用switch 而不是重复if 命令:

server <- function(input, output) 
  output$claimtable <- 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 <- c("By NDC", "By brand name", "By tier 2", "By tier 5",
                  "LDD", "By GPI class", "Other tiers", "By hierarchy")
    
server <- function(input, output) 
    output$claimtable <- 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 <- function(input, output) 
  output$claimtable <- renderTable(
    UCSF[which(table_list == input$table_type)][which(hospital_list == input$hospital_list)]
    
  

【讨论】:

您好,感谢您的分析器,如果我有两个选项,它就可以工作,不幸的是,它只有在我有两个选项时才有效,我需要应用程序更改首先取决于“selectInput = 医院”中的医院和那么第二个是分析的类型。 @amer23 你试过最后一个选项吗?它会根据这两个输入而变化。 我打错了,第一个解决方案有效,我需要用 else 完成每个 if 语句,然后重新开始 if。比你

以上是关于在我闪亮的应用服务器部分制作 if 语句的主要内容,如果未能解决你的问题,请参考以下文章

根据URL参数制作闪亮的应用UI

R闪亮的选择输入反应性

无法在闪亮的服务器上部署闪亮的应用程序

闪亮的服务器不会加载应用程序

在 R 闪亮的应用程序中接受 HTTP 请求

在没有闪亮服务器的情况下托管和设置自己的闪亮应用程序