如何修改R Shiny代码实现上传CSV文件后替换指定列的对应值
R Shiny 自定义CSV数据列值替换功能实现方案
代码修改说明
原有代码已经预留了文件上传控件,只需要补充文件读取、数据集更新、列选项动态联动三个逻辑即可实现需求,修改后既保留了默认mtcars数据集的使用能力,也支持上传自定义CSV文件执行替换操作。
完整可运行代码
library(shiny) library(DT) library(dplyr) ui <- fluidPage( sidebarLayout( sidebarPanel( fileInput("file1", "选择CSV文件", accept = ".csv"), selectInput("col", "待搜索列:", choices = NULL), textInput("old", "替换值:"), textInput("new", "替换为:"), actionButton("replace", "执行替换"), ), mainPanel( DTOutput("table1") ) ) ) server <- function(input, output, session) { # 初始默认使用mtcars数据集,无上传文件时可直接使用 my_data <- reactiveVal(mtcars) # 监听文件上传动作,读取文件并更新可选列 observeEvent(input$file1, { req(input$file1) # 读取CSV,若为空格分隔文件请将sep参数改为" ",制表符分隔改为"\t" uploaded_df <- read.csv( input$file1$datapath, header = TRUE, sep = ",", check.names = FALSE ) my_data(uploaded_df) # 动态更新列选择下拉框的选项 updateSelectInput( session, "col", choices = names(uploaded_df), selected = names(uploaded_df)[1] ) }) # 原有列值替换逻辑保持不变,自动适配数值/字符列类型 observeEvent(input$replace, { req(input$col, input$old) 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())) }) output$table1 <- renderDT( my_data() ) } shinyApp(ui, server)
效果验证
上传你提供的示例CSV文件后,选择Range列,替换值输入100,替换为输入500,点击执行替换即可得到预期的输出结果,其余列数据不会发生变更。
内容的提问来源于stack exchange,提问作者Kevin Tracey
相关产品推荐
相关产品推荐

