Как разделить выбранные столбцы из меню «Выбор» в R shiny?

#r #shiny

Вопрос:

В R shiny я использовал функцию selectInput, которая позволяет мне выбирать имена столбцов, такие как «Идентификатор» и «Тип», а также кнопку просмотра для загрузки csv-файла и кнопку «Разделить столбец», чтобы разъединить объединенные столбцы.

Что я хочу сделать, так это выбрать объединенный столбец в меню «Выбор», в данном примере «Тип», и запустить исходный код «SplitColumn.R» , чтобы удалить столбец и просмотреть результаты после загрузки csv-файла.

Вопрос

Я еще не получил никаких ошибок, но отключение работает без необходимости использовать кнопку «SplitColumn». Когда я выбираю опцию из самих опций, отключение работает.

Не мог бы кто-нибудь, пожалуйста, помочь мне с тем, чего мне не хватает в коде пользовательского интерфейса/сервера?

данные csv

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

 

Разделительный столбец.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
}
 

приложение.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)