Как Применить Регулярное Выражение в Фильтре/Кнопке Блестящего Приложения?

#r #shiny #shinydashboard #shiny-server #shinyapps

Вопрос:

Я супер новичок в блестящих приложениях и в R. Как бы я добавил кнопку, которая позволяет мне фильтровать переданный набор данных с помощью этого регулярного выражения? Загруженный набор данных будет содержать одни и те же имена столбцов, и столбец, к которому я хочу применить регулярное выражение, будет «close_notes». Я хочу сначала преобразовать этот столбец в строку, все в верхнем регистре, а затем применить регулярное выражение. Заранее большое вам спасибо за вашу помощь!

Регулярное Выражение:

"\bMASTER DATA\b|\bSOURCE LIST\b|\bVALIDITY DATES\b|\bMRP CONTROLLER\b|\bPSV\b|\bELIGIBILITY\b|\bCOST\b|\bMARKETING EXCLUSION\b|\bEFFECTIVITY\b|\bMISSING\b|bbBLANK\b"

Приведенный ниже код предназначен для приложения Shiny. Пожалуйста, дайте мне знать, если что-то покажется неправильным или его следует изменить. Спасибо!

 library(shiny)

ui <- fluidPage(
    sidebarLayout(
        sidebarPanel(
            fileInput("file1", "Choose CSV File",
                      accept = c(
                          "text/csv",
                          "text/comma-separated-values,text/plain",
                          ".csv")
            ),
            tags$hr(),
            checkboxInput("header", "Header", TRUE),
            
            # Button
            downloadButton("downloadData", "Download")
            
        ),
        mainPanel(
            dataTableOutput("contents")
        )
    )
)

server <- function(input, output) {
    
    datasetInput <- reactive({
        req(input$file1)
        # input$file1 will be NULL initially. After the user selects
        # and uploads a file, it will be a data frame with 'name',
        # 'size', 'type', and 'datapath' columns. The 'datapath'
        # column will contain the local filenames where the data can
        # be found.
        inFile <- input$file1
        
        if (is.null(inFile))
            return(NULL)
        
        read.csv(inFile$datapath, header = input$header)
    })
    
    output$contents <- renderDataTable({
        datasetInput()
    })
    
    output$downloadData <- downloadHandler(
        filename = function() {
            paste("myfile",Sys.Date(), ".csv", sep = "")
        },
        content = function(file) {
            write.csv(datasetInput(), file, row.names = FALSE)
        }
    )
}

shinyApp(ui, server)
 

Ответ №1:

Вы можете внести некоторые изменения в свой текущий код.

  • Используется reactiveValues для сохранения загруженных данных, также изменено reactive на observe .
  • Добавлен actionButton фильтр для применения после нажатия кнопки и используется observeEvent на стороне сервера.
 library(shiny)
library(dplyr)

#Define the regex to apply. 
regex_to_apply <- "\bMASTER DATA..."

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      fileInput("file1", "Choose CSV File",
                accept = c(
                  "text/csv",
                  "text/comma-separated-values,text/plain",
                  ".csv")
      ),
      tags$hr(),
      checkboxInput("header", "Header", TRUE),
      
      # Button
      downloadButton("downloadData", "Download"),
      actionButton('apply_regex', 'Apply Regex')
      
    ),
    mainPanel(
      dataTableOutput("contents")
    )
  )
)

server <- function(input, output) {
  
  rv <- reactiveValues()
  
  observe({
    req(input$file1)
    # input$file1 will be NULL initially. After the user selects
    # and uploads a file, it will be a data frame with 'name',
    # 'size', 'type', and 'datapath' columns. The 'datapath'
    # column will contain the local filenames where the data can
    # be found.
    inFile <- input$file1
    
    if (is.null(inFile))
      return(NULL)
    
    rv$data <- read.csv(inFile$datapath, header = input$header)
    
  })
  
  output$contents <- renderDataTable({
    rv$data
  })
  
  output$downloadData <- downloadHandler(
    filename = function() {
      paste("myfile",Sys.Date(), ".csv", sep = "")
    },
    content = function(file) {
      write.csv(rv$data, file, row.names = FALSE)
    }
  )
  
  observeEvent(input$apply_regex, {
    rv$data <- rv$data %>%  filter(grepl(regex_to_apply, toupper(close_notes)))
  })
}

shinyApp(ui, server)
 

Ответ №2:

Вы должны переместить границы слов за пределы чередования, вот так:

 b(MASTER DATA|SOURCE LIST|VALIDITY DATES|MRP CONTROLLER|PSV|ELIGIBILITY|COST|MARKETING EXCLUSION|EFFECTIVITY|MISSING|BLANK)b
 

Комментарии:

1. Я действительно хочу запечатлеть то, что находится внутри, поэтому регулярное выражение, которое у меня есть, правильное. Как бы я добавил это в свое блестящее приложение? Спасибо!