R Shiny数据表取消列合并功能closure类型对象不可取子集报错修复求助
R Shiny列拆分功能报错修复方案
错误原因
- 响应式变量调用错误:
my_data是reactiveVal定义的响应式对象,读取值必须加()(即my_data()),更新值必须用my_data(新值)的调用形式。原代码中直接将my_data作为普通变量赋值、传参,把函数对象传入了拆分函数,触发closure不可子集的报错。 - 冗余逻辑无效:原代码定义了
selectUI动态下拉框,但未在UI布局中挂载,实际无法使用;现有UI中已存在input$col下拉框,会在文件上传后自动更新列名,可直接复用作为拆分列的选择控件。
修复后完整代码
library(shiny) library(reshape2) library(DT) library(tibble) library(tidyverse) # 按空格拆分指定列的函数 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 } ui <- fluidPage( sidebarLayout( sidebarPanel( fileInput("file1", "选择CSV文件", accept = ".csv"), checkboxInput("header", "包含表头", TRUE), selectInput("col", "要处理的列:", NULL), actionButton("unmerge", "拆分列", class = "btn-warning" ), textInput("old", "替换原值:"), textInput("new", "替换为:"), actionButton("replace", "执行替换"), ), mainPanel( DTOutput("table1") ) ) ) server <- function(input, output, session) { my_data <- reactiveVal(NULL) observeEvent(input$file1, { file <- input$file1 ext <- tools::file_ext(file$datapath) req(file) validate(need(ext == "csv", "请上传CSV格式的文件")) my_data(read.csv(file$datapath, header = input$header)) updateSelectInput(session, "col", choices = names(my_data())) }) observeEvent(input$replace, { req(input$col, my_data()) dat <- my_data() traf <- if (is.numeric(dat[[input$col]])) as.numeric else identity my_data(dat %>% mutate(!!rlang::sym(input$col) := replace(!!rlang::sym(input$col), as.character(!!rlang::sym(input$col)) == input$old, input$new) %>% traf())) updateSelectInput(session, "col", choices = names(my_data())) }) output$table1 <- renderDT( req(my_data()) ) observeEvent(input$unmerge, { req(input$col, my_data()) processed_data <- splitColumn(my_data(), input$col) my_data(processed_data) updateSelectInput(session, "col", choices = names(my_data())) }) } shinyApp(ui, server)
使用说明
上传CSV文件后,在「要处理的列」下拉框选择要拆分的列,点击「拆分列」按钮即可按空格完成列拆分,拆分完成后下拉框会自动更新为新的列名,值替换功能可正常使用。
内容的提问来源于stack exchange,提问作者Kevin Tracey
相关产品推荐
相关产品推荐

