Shiny中使用data.table删除数据列报错:invalid argument to unary operator
修复Shiny中data.table删除列的"invalid argument to unary operator"错误
错误根源
你尝试对字符向量直接使用一元负号-(nameofthecolumn),这在R中是不允许的——负号仅支持数值类型,而input$selectColumn返回的是选中列的字符名称向量,因此触发该错误。dplyr能正常运行是因为-all_of(nameofthecolumn)是其专门处理字符向量列名的语法,data.table不兼容这种写法。
修复方案
针对data.table语法,有两种可靠的修复方式:
方法1:使用!运算符直接排除目标列
data.table支持用!对字符向量列名取反,直接排除指定列:
removecolumn <- function(df, nameofthecolumn) { setDT(df)[, !nameofthecolumn, with = FALSE] }
注:若你的data.table版本≥1.14.0,
with=FALSE可省略,新版本支持直接用!处理字符向量列名。
方法2:通过列索引位置删除
先将字符列名转换为对应的列索引,再用负号排除:
removecolumn <- function(df, nameofthecolumn) { col_indices <- which(names(df) %in% nameofthecolumn) setDT(df)[, -col_indices] }
修复后完整示例代码
library(shiny) library(data.table) library(magrittr) ui <- fluidPage( titlePanel("CSV File Upload"), sidebarLayout( sidebarPanel( fileInput("file", "Choose CSV file", accept = ".csv"), uiOutput("selectColumn"), actionButton("removeCol", "Remove") ), mainPanel( tableOutput("table") ) ) ) server <- function(input, output) { rv <- reactiveValues(data = NULL) observeEvent(input$file, { rv$data <- read.csv(input$file$datapath, header = TRUE) }) output$table <- renderTable({ rv$data }) output$selectColumn <- renderUI({ shiny::req(rv$data) selectInput(inputId = "selectColumn", label = "Select sample(s) to remove", multiple = TRUE, choices = names(rv$data) ) }) # 修复后的data.table版本removecolumn函数 removecolumn <- function(df, nameofthecolumn) { setDT(df)[, !nameofthecolumn, with = FALSE] } observeEvent(input$removeCol, { shiny::req(rv$data) rv$data <- removecolumn(rv$data, input$selectColumn) }) } shinyApp(ui, server)
内容的提问来源于stack exchange,提问作者Wang
相关产品推荐
相关产品推荐

