如何在R Shiny中通过按钮触发拆分选择菜单选中的列
问题原因
- 事件绑定错误:拆分逻辑的
observeEvent监听对象是下拉框选择事件input$selectcolumn,只要下拉选项变更就会触发拆分,没有绑定到「SplitColumn」按钮的点击事件input$Splitcolumn - 下拉框配置错误:
selectInput的choices参数错误写为c('ID, Type'),仅生成单个字符串选项,无法正常选择ID、Type两个独立列。另外硬编码列名兼容性差,建议上传文件后动态匹配实际列名 - 依赖包缺失:
splitColumn函数用到reshape2包的colsplit方法,代码中未声明加载会触发隐式报错 - 文件读取配置错误:测试数据为空格分隔,默认
read.csv按逗号分隔读取,会导致列识别错误
修正后代码
SplitColumn.R
library(reshape2) splitColumn <- function(data, column_name) { newColNames <- c("Unmerged_type1", "Unmerged_type2") newCols <- colsplit(data[[column_name]], " ", newColNames) after_merge <- cbind(data, newCols) after_merge[[column_name]] <- NULL after_merge }
app.R
library(shiny) source('SplitColumn.R') ui <- fluidPage( sidebarLayout( sidebarPanel( fileInput("file1", "Choose CSV File", accept = ".csv"), checkboxInput("header", "Header", TRUE), actionButton("Splitcolumn", "SplitColumn"), # 初始下拉选项为空,上传文件后动态更新 selectInput(inputId='selectcolumn', label='select column', choices = NULL) ), mainPanel( tableOutput("contents") ) ) ) server <- function(input, output, session) { rv <- reactiveValues(data = NULL) # 上传文件后读取数据,同时更新下拉框的列选项 observe({ file <- input$file1 ext <- tools::file_ext(file$datapath) req(file) validate(need(ext == "csv", "Please upload a csv file")) # 加sep=""适配空格分隔的测试数据 rv$data <- read.csv(file$datapath, header = input$header, sep = "") # 动态更新下拉选项为文件实际列名 updateSelectInput(session, "selectcolumn", choices = colnames(rv$data)) }) output$contents <- renderTable({ req(rv$data) rv$data }) # 绑定拆分逻辑到按钮点击事件,仅点击按钮才执行拆分 observeEvent(input$Splitcolumn, { req(rv$data, input$selectcolumn) rv$data <- splitColumn(rv$data, input$selectcolumn) }) } shinyApp(ui, server)
内容的提问来源于stack exchange,提问作者Kevin Tracey
相关产品推荐
相关产品推荐

