R Shiny样本量计算器else if逻辑报错及无输出问题求助
解决你的R Shiny样本量计算器问题
首先,你的代码里有几个关键问题导致输出异常,我来一步步帮你修正:
核心问题:单选按钮的ID错误
在UI的radioButtons中,你给inputId加了多余的单引号:
radioButtons( inputId = "'QC_Type'", # 这里的单引号是错误的! label = "QC Type", choices = c(...) )
这个错误会让Shiny无法识别input$QC_Type,因为实际的ID变成了带单引号的'QC_Type'(而不是QC_Type),这直接导致后续无法读取单选按钮的选择值。
其他优化点
- 不需要把input包装成reactive:在
renderText里直接使用input$QC_Type即可,不需要额外定义x <- reactive({input$QC_Type}),这只会增加不必要的复杂度。 - 简化条件判断逻辑:把不同QC类型对应的计算系数存到一个命名向量里,替代重复的
if else语句,代码更简洁易维护。 - 确保req的正确使用:
req(input$QC_Type, input$expn)可以同时检查两个输入是否有效,避免参数长度为0的错误。
修正后的完整代码
library(shiny) ui <- shinyUI(fluidPage( titlePanel("alpha version of sample size calculator"), sidebarPanel( numericInput( "expn", "Please enter total number of reports received", 1, min = 0, max = 1000000 ), radioButtons( inputId = "QC_Type", # 去掉了多余的单引号 label = "QC Type", choices = c( "Overall" = "a", "Solicited" ="b", "Spontaneous" = "c", "Clinical Trial"="d", "Literature"= "e" ) ) ), mainPanel ( p ("Your required sample size is"), textOutput("results") ) )) server <- function (input, output,session) { options(digits=2) # 预先计算各类型的系数,存到命名向量里 qc_coefficients <- c( a = (1.96^2)*0.3*0.7/(0.05^2), b = (1.96^2)*0.32*0.68/(0.05^2), c = (1.96^2)*0.35*0.65/(0.05^2), d = (1.96^2)*0.26*0.74/(0.05^2), e = (1.96^2)*0.36*0.64/(0.05^2) ) output$results <- renderText({ # 检查输入是否有效 req(input$QC_Type, input$expn) # 获取当前选择的系数 current_coef <- qc_coefficients[input$QC_Type] # 计算样本量 sample_size <- (input$expn * current_coef) / (input$expn + current_coef + 1) # 保留两位小数并转为字符输出 round(sample_size, 2) }) } shinyApp(ui = ui, server= server)
代码解释
- 修正了单选按钮的ID,确保Shiny能正确读取选择值。
- 用命名向量存储各QC类型的系数,避免了重复的条件判断,后续修改系数只需更新向量即可。
- 使用
req()确保只有当两个输入都有效时才执行计算,避免报错。 - 计算结果用
round()保留两位小数,输出更美观。
现在运行这个代码,你应该能看到正确的样本量计算结果了。
内容的提问来源于stack exchange,提问作者Rimip
相关产品推荐
相关产品推荐

