如何从 R Shiny 的选择菜单中拆分选定的列?

Posted

技术标签:

【中文标题】如何从 R Shiny 的选择菜单中拆分选定的列?【英文标题】:How to split selected columns from the choices menu in R shiny? 【发布时间】:2021-10-13 21:20:36 【问题描述】:

在 R shiny 中,我使用了 SelectInput 函数,它允许我选择列名称,如“ID”和“类型”,以及一个浏览按钮来上传 csv 文件和一个“SplitColumn”按钮来取消合并列。

我想要做的是,我应该从选择菜单中选择合并的列,在本例中为“类型”,然后运行源代码“SplitColumn.R”来取消合并列并在上传 csv 后观察结果文件。

问题

我尚未收到任何错误,但无需使用“SplitColumn”按钮即可取消合并。当我从选项本身中选择选项时,取消合并有效。

有人可以帮助我解决 ui/server 代码中缺少的任何内容吗?

csv 数据

ID  Type   Range
21  A1 B1   100
22  C1 D1   200
23  E1 F1   300

SplitColumn.R

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_stack.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=c('ID, Type'))
    ),
    mainPanel(
      tableOutput("contents")
    )
  )
)

server <- function(input, output) 
  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"))
    
    rv$data <- read.csv(file$datapath, header = input$header)
    
  )
  
  output$contents <- renderTable(
    req(rv$data)
    rv$data
  )
  # column_name <- dlg_input("Enter a number", Sys.info()["user"])$res
  
  observeEvent(input$selectcolumn, 
    rv$data <- splitColumn(rv$data, input$selectcolumn)
  )

shinyApp(ui, server)

【问题讨论】:

【参考方案1】:

试试这个代码 -

library(shiny)

source('splitColumn_stack.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', '')
    ),
    mainPanel(
      tableOutput("contents")
    )
  )
)

server <- function(session, input, output) 
  rv <- reactiveValues(data = NULL)
  
  observeEvent(input$file1, 
    file <- input$file1
    ext <- tools::file_ext(file$datapath)
    
    req(file)
    
    validate(need(ext == "csv", "Please upload a csv file"))
    
    rv$data <- read.csv(file$datapath, header = input$header)
    
    updateSelectInput(session, 'selectcolumn', 'select column', names(rv$data))
    
  )
  
  output$contents <- renderTable(
    req(rv$data)
    rv$data
  )
  
  
  observeEvent(input$Splitcolumn, 
    rv$data <- splitColumn(rv$data, input$selectcolumn)
    
  )

shinyApp(ui, server)

【讨论】:

以上是关于如何从 R Shiny 的选择菜单中拆分选定的列?的主要内容,如果未能解决你的问题,请参考以下文章

R Shiny - 我无法从selectInput操作中检索选定的输出值

如何使用 actionButton 更改 R Shiny 中 selectInput 上的选定值?

根据 r shiny 中的选定类别创建图表饼图

R Shiny DataTable如何防止包含超链接的列中的行选择/取消选择

从 SelectInput (R Shiny) 中的分组选项列表中获取组标签

从 R Shiny 中的选定输入中过滤