R Shiny reactive函数中多if语句仅返回最后一个条件结果求助
问题原因
R 语言的代码块默认将最后一个被执行的表达式结果作为返回值,你当前编写的三个if是独立判断分支,没有互斥关系:
无论前两个if是否匹配成功,代码都会执行到最后一个if判断。如果最后一个if的条件不成立,该分支无返回值,整个reactive块就会返回空值;只有当前选中的选项刚好对应最后一个if的判断条件时,才能拿到正确结果,所以调整if顺序后返回结果会同步变化。
修复方案
方案1:改用互斥的if-else分支
将独立if改为串联的if-else结构,匹配到第一个符合条件的分支后就不会继续执行后续判断,可正常返回对应结果:
mx <- reactive({ x <- as.numeric(unlist(strsplit(input$numbers,","))) if (input$mean_type == 'A') { mean(x) } else if (input$mean_type == 'V') { sd(x) } else if (input$mean_type == 'G') { geometric.mean(x) } })
方案2:使用switch简化多分支匹配
针对这类固定枚举值的多分支匹配场景,用switch写法更简洁易读:
mx <- reactive({ x <- as.numeric(unlist(strsplit(input$numbers,","))) switch(input$mean_type, "A" = mean(x), "V" = sd(x), "G" = geometric.mean(x) ) })
额外提示
你单选按钮标注的选项是Variance(方差),但当前代码中调用的sd(x)是计算标准差的函数,如果需要输出方差可替换为var(x)。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

