在R中的Shiny App中使用if else语句

cmssoen2  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(110)

我正试图创建一个闪亮的应用程序,我是相当新的游戏闪亮。我已经弄清楚了用户界面,我读了大量的威克姆的“掌握闪亮”。然而,我还没有找到任何解决方案或好的资源来处理Shiny中的if else语句。
该应用程序从用户处获取输入:
1.年龄组
1.生理性别
1.峰值摄氧量
基于该输入,应用程序应该标准化峰值O2结果,并向用户返回距他/她的年龄组的平均值有多少SD。
我被困在这了。任何关于如何完成此代码的帮助将不胜感激。

验证码如下:

# Load packages

library(shiny)
library(tidyverse)

# Vo2 max reference values for men

men_20_29_yrs <- 54
men_30_39_yrs <- 49
men_40_49_yrs <- 47
men_50_59_yrs <- 42
men_60_69_yrs <- 39
men_above_70_yrs <- 34

# SD's for each age group segment for men

men_20_29_yrs_sd <- 8.8
men_30_39_yrs_sd <- 7.9
men_40_49_yrs_sd <- 8.0
men_50_59_yrs_sd <- 7.6
men_60_69_yrs_sd <- 6.9
men_above_70_yrs_sd <- 7.1

# Vo2 max reference values for women

wmn_20_29_yrs <- 43
wmn_30_39_yrs <- 40
wmn_40_49_yrs <- 38
wmn_50_59_yrs <- 34
wmn_60_69_yrs <- 31
wmn_above_70_yrs <- 27

# SD's for each age group segment for women

wmn_20_29_yrs_sd <- 7.6
wmn_30_39_yrs_sd <- 7.0
wmn_40_49_yrs_sd <- 7.0
wmn_50_59_yrs_sd <- 5.7
wmn_60_69_yrs_sd <- 5.1
wmn_above_70_yrs_sd <- 5.1

# UI

ui <- fluidPage(
  
  tabPanel("Maksimalt oksygenopptak"),
  
    # App title
  
    titlePanel("Hvor bra er ditt maksimale oksygenopptak?"),
  
    # Sidebar layout 
  
    sidebarLayout(
      sidebarPanel(
      
        # Age group segments
        
        radioButtons(
          inputId = "age_group",
          label = p("Hvilken aldersgruppe hører du til?"),
          choices = c("20-29 år", "30-39 år", "40-49 år", "50-59 år",
                    "60-69 år", "Over 70 år")
          ),
      
        # Biological sex
        
        radioButtons(
          inputId = "sex",
          label = "Hva er ditt biologiske kjønn?",
          choices = c("Mann", "Kvinne")
          ),
      
        # V02 max slider
        
        sliderInput(
          inputId = "v02max",
          label = "Hva er ditt maksimale oksygenopptak?",
          min = 0,
          max = 100,
          value = 50),
      
        actionButton(
          inputId = "calculate",
          label = "Vis meg resultatet mitt",
          class = "btn-lg btn-success"
        )
      ),
    
      # Web page functionality explanation
      
      mainPanel(
        
        p("Denne nettsiden tar inn informasjon om din alder, ditt kjønn og ditt
          maksimale oksygenopptak. Med den informasjonen får du svar på hvor
          godt ditt maksimale oksygenopptak er i forhold til referanseverdier for
          din alder og ditt kjønn."
          ),
        
        p("Før inn din", strong("alder,"), "ditt", strong("kjønn"), "og ditt", 
          strong("maksimale oksygenopptak"), "så vil du få resultatene
          dine."),
        
        p("Referanseverdier er fra Loe et al., 2014:", a("https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0113884")
          ),
        
        plotOutput("plot"),
        
        verbatimTextOutput("results")
        
      )
    )
  )

# Server logic

server <- function(input, output) {
  
  dataInput <- reactive({
    
    # If else statements
    
    if (input$sex == "Mann") {
      
      if (input$age_group == "20-29 år") {
        v02 <- men_20_29_yrs
        sd <- men_20_29_yrs_sd
        
      } else if (input$age_group == "30-39 år") {
        v02 <- men_30_39_yrs
        sd <- men_30_39_yrs_sd
        
      } else if (input$age_group == "40-49 år") {
        v02 <- men_40_49_yrs
        sd <- men_40_49_yrs_sd
        
      } else if (input$age_group == "50-59 år") {
        v02 <- men_50_59_yrs
        sd <- men_50_59_yrs_sd
        
      } else if (input$age_group == "60-69 år") {
        v02 <- men_60_69_yrs
        sd <- men_60_69_yrs_sd
        
      } else if (input$age_group == "Over 70 år") {
        v02 <- men_above_70_yrs
        sd <- men_above_70_yrs_sd
      }
      
    } else if (input$sex == "Kvinne") {
      
      if (input$age_group == "20-29 år") {
        v02 <- wmn_20_29_yrs
        sd <- wmn_20_29_yrs_sd
        
      } else if (input$age_group == "30-39 år") {
        v02 <- wmn_30_39_yrs
        sd <- wmn_30_39_yrs_sd
        
      } else if (input$age_group == "40-49 år") {
        v02 <- wmn_40_49_yrs
        sd <- wmn_40_49_yrs_sd
        
      } else if (input$age_group == "50-59 år") {
        v02 <- wmn_50_59_yrs
        sd <- wmn_50_59_yrs_sd
        
      } else if (input$age_group == "60-69 år") {
        v02 <- wmn_60_69_yrs
        sd <- wmn_60_69_yrs_sd
        
      } else if (input$age_group == "40-49 år") {
        v02 <- wmn_above_70_yrs
        sd <- wmn_above_yrs_sd
      }
    
    }
  })
}
    
# Run the application 

shinyApp(ui = ui, server = server)
f0brbegy

f0brbegy1#

好吧,在编程中,只要它能工作,就没有“错误”的方法。然而,我认为你用这种方法阻碍了自己。首先,我将数据放入data.frame

df <- data.frame(
    sex = rep(c("men", "wmn"), each = 6),
    age = rep(c("20-29 år", "30-39 år", "40-49 år", "50-59 år", "60-69 år", "Over 70 år"), 2),
    v02 = c(54, 49, 47, 42, 39, 34, 43, 40, 38, 34, 31, 27),
    sd = c(8.8, 7.9, 8.0, 7.6, 6.9, 7.1, 7.6, 7.0, 7.0, 5.7, 5.1, 5.1)
)

然后,您可以通过应用中的输入轻松过滤此数据框:

dataInput <- reactive({
            df %>% 
                    filter(sex == input$sex,
                           age == input$age_group)
            })

剩下要做的就是计算结果并打印结果:

output$results <- renderPrint({
            res <- (input$v02max -  dataInput()$v02) / dataInput()$sd
            
            paste(round(res, digits = 3), "standard deviations from the mean")
    })

这是整个App的样子。请注意,我将sex输入中的选项更改为命名向量。choices = c("Mann" = "men", "Kvinne" = "wmn")

library(shiny)
library(tidyverse)

df <- data.frame(
        sex = rep(c("men", "wmn"), each = 6),
        age = rep(c("20-29 år", "30-39 år", "40-49 år", "50-59 år", "60-69 år", "Over 70 år"), 2),
        v02 = c(54, 49, 47, 42, 39, 34, 43, 40, 38, 34, 31, 27),
        sd = c(8.8, 7.9, 8.0, 7.6, 6.9, 7.1, 7.6, 7.0, 7.0, 5.7, 5.1, 5.1)
)

ui <- fluidPage(
        
        tabPanel("Maksimalt oksygenopptak"),
        
        # App title
        
        titlePanel("Hvor bra er ditt maksimale oksygenopptak?"),
        
        # Sidebar layout 
        
        sidebarLayout(
                sidebarPanel(
                        
                        # Age group segments
                        
                        radioButtons(
                                inputId = "age_group",
                                label = p("Hvilken aldersgruppe hører du til?"),
                                choices = c("20-29 år", "30-39 år", "40-49 år", "50-59 år",
                                            "60-69 år", "Over 70 år")
                        ),
                        
                        # Biological sex
                        
                        radioButtons(
                                inputId = "sex",
                                label = "Hva er ditt biologiske kjønn?",
                                choices = c("Mann" = "men", "Kvinne" = "wmn")
                        ),
                        
                        # V02 max slider
                        
                        sliderInput(
                                inputId = "v02max",
                                label = "Hva er ditt maksimale oksygenopptak?",
                                min = 0,
                                max = 100,
                                value = 50),
                        
                        actionButton(
                                inputId = "calculate",
                                label = "Vis meg resultatet mitt",
                                class = "btn-lg btn-success"
                        )
                ),
                
                # Web page functionality explanation
                
                mainPanel(
                        
                        p("Denne nettsiden tar inn informasjon om din alder, ditt kjønn og ditt
          maksimale oksygenopptak. Med den informasjonen får du svar på hvor
          godt ditt maksimale oksygenopptak er i forhold til referanseverdier for
          din alder og ditt kjønn."
                        ),
                        
                        p("Før inn din", strong("alder,"), "ditt", strong("kjønn"), "og ditt", 
                          strong("maksimale oksygenopptak"), "så vil du få resultatene
          dine."),
                        
                        p("Referanseverdier er fra Loe et al., 2014:", a("https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0113884")
                        ),
                        
                        plotOutput("plot"),
                        
                        verbatimTextOutput("results")
                        
                )
        )
)

# Server logic

server <- function(input, output) {
        
        dataInput <- reactive({
                df %>% 
                        filter(sex == input$sex,
                               age == input$age_group)
                }) %>% 
                bindEvent(input$calculate)
        
        output$results <- renderPrint({
                res <- (input$v02max -  dataInput()$v02) / dataInput()$sd
                
                paste(round(res, digits = 3), "standard deviations from the mean")
        }) %>% 
            bindEvent(dataInput())
}

# Run the application 

shinyApp(ui = ui, server = server)

相关问题