如何基于Shiny UI端选中的输入值在服务端获取匹配的输出值
问题解决办法
错误根因
- 行筛选语法错误:你将逻辑与运算符
&错误放置在输出字段的取值表达式之间,而非行过滤的条件区间内,导致对数值、字符向量执行了无意义的逻辑运算,直接触发你遇到的两个报错。 - 匹配结果长度不唯一:你的示例数据中,同一组input1、input2的组合对应多条记录,直接筛选会返回多个值,而
valueBox的value参数要求传入长度为1的内容,也会引发报错。 - 下拉选项冗余:你直接使用数据列的全部值作为下拉框选项,会出现大量重复选项,建议用
unique()去重优化。
修正后完整代码
## loading packages { library(shiny) library(shinydashboard) library(htmltools) library(rvest) library(XML) library(measurements) library(ggplot2) library(ggrepel) library(plotly) library(shinyjs) library(shinyWidgets) } Test <- read.csv("Test.csv", stringsAsFactors = FALSE) ui <- dashboardPage( dashboardHeader(), dashboardSidebar( useShinyjs(), # 下拉选项去重优化 selectInput ("a",label = colnames(Test)[1], choices = unique(Test[[1]])), selectInput("b",colnames(Test)[2], choices = unique(Test[[2]])) ), dashboardBody( fluidRow(valueBoxOutput("info_box1", width = 6)), fluidRow(valueBoxOutput("info_box2", width = 6)) ) ) server <- function(input, output) { output$info_box1 <- renderValueBox({ # 修正筛选逻辑:将两个判断条件放在[]内做行过滤,这里取第一个匹配值,也可根据需求替换为mean()、max()等聚合函数 target_num <- Test$NumericOutput[Test$input1 == input$a & Test$input2 == input$b][1] valueBox(value = paste0("Score in %: ", round(target_num, 2)), subtitle = NULL) }) output$info_box2 <- renderValueBox({ # 同理修正字符型输出的筛选逻辑 target_char <- Test$CharacterOutput[Test$input1 == input$a & Test$input2 == input$b][1] valueBox(value = paste0("Assessment: ", target_char), subtitle = NULL) }) } shinyApp(ui, server)
补充说明
如果你的实际需求是对同一输入组合的多个数值做聚合计算,只需要把取值后的[1]替换为对应的聚合函数即可,比如求平均值就改成mean(Test$NumericOutput[Test$input1 == input$a & Test$input2 == input$b], na.rm = TRUE)。
内容的提问来源于stack exchange,提问作者Anam Iqbal
相关产品推荐
相关产品推荐

