【问题标题】:Calculate total score and categorize it based on input计算总分并根据输入进行分类
【发布时间】:2021-10-28 05:50:18
【问题描述】:

我正在尝试为 SLE 疾病评分系统创建一个应用程序,其中每个症状都用不同的数字表示,

症状总分将被划分成一个分数范围来确定疾病活动度。

这是我正在尝试编写的代码,但我无法弄清楚导致该程序无法运行的问题。




ui <- fluidPage(
    checkboxGroupInput("variable", "Variables to show:",
                       c("Neurological disorder" = "neu",
                         "Kidney disorder" = "gin",
                         "Vasculitis" = "vas",
                         "Haemolysis/ Thrombositopenia" = "hem",
                         "Myositis" = "mio",
                         "Artritis" = "art",
                         "Mucocutaneous disorder" = "muc",
                         "Serositis" = "ser",
                         "Fever/ Fatique" = "fev",
                         "Leukopenia/ Lhymphopenia" = "leu"
                         )),
    textOutput("data")
)

server <- function(input, output, session) {

    
    output$data <- reactive({
        input$neu <-  8
        input$gin <- 6
        input$vas <- 4
        input$hem <- 3
        input$mio <- 3
        input$art <- 2
        input$mio <- 2
        input$ser <- 2
        input$fev <- 1
        input$leu <- 1
        
    
        total <- input$neu + input$gin + input$vas + input$hem + input$mio +  
            input$art + input$mio + input$ser + input$fev + input$fev + input$leu
        
        if (total <= 2) {"Mild disease activity"}
        else if (total > 2 && < 5) {"Moderate disease activity"}
        else if (total >= 5){"Severe disease activity"}
        })
}

shinyApp (ui, server)


感谢您的帮助

【问题讨论】:

  • 我猜你的意思是分配=&lt;- 而不是比较==
  • 感谢您的更正,我已经编辑了示例,但仍然无法运行应用程序。你能告诉我错误在哪里吗?
  • 问题还在于这些输入是只读的,即您不能将其分配给一个值。
  • 另外,您的输入名称是“变量”,而不是 neu 或其他任何名称。这些是存储的值
  • 我认为发布的解决方案应该有效。你能测试一下吗

标签: r if-statement shiny reactive calc


【解决方案1】:

我们可以使用命名向量来匹配并根据'input$variable'的选择值返回数字,仅使用sum 获取total 并使用OP 帖子中的相同条件返回'疾病活动的价值

library(shiny)
ui <- fluidPage(
  checkboxGroupInput("variable", "Variables to show:",
                     c("Neurological disorder" = "neu",
                       "Kidney disorder" = "gin",
                       "Vasculitis" = "vas",
                       "Haemolysis/ Thrombositopenia" = "hem",
                       "Myositis" = "mio",
                       "Artritis" = "art",
                       "Mucocutaneous disorder" = "muc",
                       "Serositis" = "ser",
                       "Fever/ Fatique" = "fev",
                       "Leukopenia/ Lhymphopenia" = "leu"
                     ), selected = "Leukopenia/ Lhymphopenia" = "leu"),
  textOutput("data")
)

server <- function(input, output, session) {
  
  
output$data <- reactive({
    nm1 <- setNames(c(8, 6, 4, 3, 3, 2, 2, 2, 1, 1), 
    c("neu", "gin", "vas", "hem", "mio", "art", "mio", "ser", "fev", "leu"))
    
   total <- sum(nm1[input$variable], na.rm = TRUE)
   if (total <= 2) {out <- "Mild disease activity"}
   else if (total > 2 && total < 5) {out <- "Moderate disease activity"}
   else if (total > 5) {out <- "Severe disease activity"}
   out
  })
}
  
shinyApp(ui, server)

-输出

【讨论】:

    【解决方案2】:

    我们基于 SLEDAI-2K 仪器对狼疮严重程度进行了类似的调查。

    我们将所有表现(体征、症状和实验室结果)放在一个 data.frame 中,并在第二列中包含与总分相关的分数。

    完成后,您的shiny 应用程序可以引用所有复选框的表现列。然后,分数总和将是基于选定复选框对 data.frame 进行子集的结果。

    最后,我们用cut取数字分数总和,分为轻度、中度、重度3个类别。

    library(shiny)
    
    df <- data.frame(
      manifestation = c("Recent onset seizure", "Psychosis", "Organic brain syndrome",
        "Visual disturbance", "New onset sensory or motor neuropathy involving cranial nerves", 
        "Lupus headache", "New onset stroke", "Vasculitis", "Arthritis", "Myositis", "Heme-granular or RBC urinary casts",
        "Hematuria", "Proteinuria", "Pyuria", "Inflammatory-type rash", "Alopecia", "Oral or nasal mucosal ulcers",
        "Pleuritic chest pain with pleural rub/effusion or pleural thickening", "Pericarditis", "Low complement",
        "High DNA binding", "Temp >100.4 °F (38 °C)", "Platelets <100 x 10^9/L", "WBC <3 x 10^9/L"),
      score = c(rep(8, 8), rep(4, 6), rep(2, 7), rep(1, 3))
    )
    
    ui <- fluidPage(
      checkboxGroupInput("variable", "Variables to show:", df$manifestation),
      textOutput("data")
    )
    
    server <- function(input, output, session) {
      output$data <- reactive({
        total <- sum(df[df$manifestation %in% input$variable, "score"])
        return(paste("Disease Severity:", cut(total, breaks = c(0, 2, 6, Inf), labels = c("Mild", "Moderate", "Severe"))))
      })
    }
    
    shinyApp (ui, server)
    

    【讨论】:

      猜你喜欢
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多