从Excel复制单元格粘贴到R Shiny的textAreaInput功能异常求助
问题根因
你遇到的异常和collapse = "\n"无关,是data.table::fread的默认适配逻辑在单列表格粘贴场景下的误判导致的:
- 单字符
a丢失:fread默认开启表头自动识别,会把第一行内容当成列名读取,你后续强行赋值colnames(df_table) <- c("Method")时就覆盖丢弃了原本作为表头识别的第一行内容 - 连字符报错:fread遇到首行以
-开头的单列输入时,会误判为命令行参数格式的输入,触发格式解析错误 - 双列粘贴无异常是因为多列内容会让fread的解析逻辑跳过上述两种单列场景下的极端适配规则
修复方案
只需要给fread添加强制参数,关闭自动表头识别、强制按换行符分割内容即可,修改后的完整代码如下:
library(shiny) library(data.table) library(DT) ui <-fluidPage( textAreaInput("pasted", "paste text here"), dataTableOutput("table") ) server <- function(input, output, session) { df_table <- reactive({ if (input$pasted != '') { # 核心修改:强制不识别表头,强制用换行符作为分隔符,禁用自动参数识别 df_table <- fread( text = paste(input$pasted, collapse = "\n"), header = FALSE, sep = "\n", col.names = "Method", strip.white = FALSE ) as.data.frame(df_table) } }) output$table <- renderDataTable({ df_table() }, filter="top", class = 'hover cell-border stripe', editable= TRUE,extensions= 'Buttons', options = list(dom = 'Bfrtip',pageLength =10, buttons = c('copy','csv','excel','pdf','print'), scrollX=TRUE),server=FALSE) } shinyApp(ui, server)
额外说明
如果后续需要支持多列粘贴,只需要把sep = "\n"改成sep = "\t"即可,因为Excel复制的多列内容默认用制表符分隔列,换行符分隔行。
内容的提问来源于stack exchange,提问作者Sky_7
相关产品推荐
相关产品推荐

