Shiny应用报错:checkName: Must use single string to index into reactivevalues排查
Shiny点击散点图获取行索引错误分析与解决
错误原因
- 列索引方式错误:代码中使用
df$x_names和df$y_names,但x_names、y_names是存储列名的字符串变量,df$x_names会去数据框中查找名为x_names的列,而非变量指向的目标列,导致无法匹配到对应数据,返回integer(0)。 - 坐标匹配精度问题:
input$plot_click_1$x和input$plot_click_1$y返回的是浮点数,直接用==做精确匹配几乎无法命中散点图上的点,这是row_index为空的核心原因。 - 空值赋值引发会话异常:当
row_index为integer(0)时,直接赋值给reactiveValues会触发checkName错误,导致会话终止。
解决方法
- 修正列索引方式:用
df[[x_names]]替代df$x_names,通过字符串变量正确索引数据框列。 - 使用
nearPoints处理点击匹配:Shiny内置的nearPoints函数专门针对绘图点击场景,能自动处理坐标精度问题,直接返回匹配的行数据或索引,避免手动匹配的误差。 - 增加空值判断:在赋值给
reactiveValues前,先判断匹配结果是否有效,避免空值引发的异常。
修正后的Server端代码
server <- function(input, output, session){ #-------------------------------------------- output$Variables <- renderUI({ req(files_list_creator_1()) numVar <- as.integer(length(files_list_creator_1())) taglist = list(radioButtons(inputId = "file_num", label ="File number", choices = c("Choices will appear here"))) for (i in 1:numVar){ taglist = append(taglist, list(radioButtons(inputId = paste0("x_var_of_file", i, sep ="_") , label = paste("x Variables of file", i, sep = "-"), choices = c("Choices will appear here")))) taglist = append(taglist, list(radioButtons(inputId = paste0("y_var_of_file", i, sep ="_") , label = paste("y Variables of file", i, sep = "-"), choices = c("Choices will appear here")))) } tagList(taglist) }) #--------------------------------------------------------- selected_point_index = reactiveValues() near_point_results = reactiveValues() observeEvent(input$plot_click_1,{ req(files_list_creator_1(), input$file_num, input[[paste0("x_var_of_file", input$file_num, sep ="_")]], input[[paste0("y_var_of_file", input$file_num, sep ="_")]]) i = as.integer(input$file_num) x_names = input[[paste0("x_var_of_file", i, sep ="_")]] y_names = input[[paste0("y_var_of_file", i, sep ="_")]] df = files_list_creator_1()[[i]] # 使用nearPoints获取匹配的行,返回数据框 clicked_point <- nearPoints(df, input$plot_click_1, xvar = x_names, yvar = y_names) # 获取行索引(如果有匹配结果) if(nrow(clicked_point) > 0){ row_index <- rownames(clicked_point) %>% as.integer() selected_point_index[[paste0("near_point_of_file", i, sep ="_")]] = row_index print(row_index) } else { print("未匹配到任何点") } }) }
内容的提问来源于stack exchange,提问作者user22354047
相关产品推荐
相关产品推荐

