Regex в textinput не работает с R Shiny - PullRequest
0 голосов
/ 15 января 2019

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

Код работает нормально из среды Shiny, но не дает никаких результатов при запуске через Shiny. Я совершенно не прорисовываю здесь ...

Вот код:

library(shiny)
library(shinydashboard)
library(data.table)
library(tidyverse)
library(future.apply)
library(readr)
library(stringr)

regex_extract <- function(data.dir, file,parent.term,child.term) {
  file <- read_file(paste(data.dir,file,sep="/"))
  file <- tolower(file)
  file <- iconv(file, "latin1", "ASCII", sub="")
  file <- gsub("[:'\\(\\)]","",file)
  file <- str_squish(file)
  rel.phrase <- unique(str_extract(file,parent.term))
  rel.amt <- str_extract(rel.phrase,child.term)
  rel.amt <- gsub("\\$","",rel.amt)
  output <- data.table(phrase = rel.phrase, context = rel.amt)
}  

regex.ftn <- function(data.dir,parent.term,child.term,progress=FALSE){
  allfiles <- list.files(data.dir,pattern = ".txt")

  for (i in 1:10){
    Sys.sleep(0.1)
    if(progress) incProgress(1/10)
  }

  output <- do.call("rbind", future_lapply(allfiles,function (x) regex_extract(data.dir,x,parent.term,child.term)))

  return(output)

}

###--- Header ----------
header <- dashboardHeader(title = "TEST")
###--- Sidebar ----------
sidebar <- dashboardSidebar(
  sidebarMenu(
    textInput("dir", "Data directory", value = "C:\\Text mining", width = NULL, placeholder = NULL),
    textInput("regex1", "Parent Expression"),
    textInput("regex2", "Child Expression"),
    actionButton("searchButton", "Search...")                                                
  )
)


###--- Body ----------
body <- dashboardBody(
  fluidRow(
    h2("Search Result"),
    DT::dataTableOutput('table1')
  )
)

###--- Dashboard------
ui <- dashboardPage(
  header,
  sidebar,  
  body
)

server <- function(input, output) { 
  dir <- reactive({
    dir <- input$dir
    if (is.null(dir))
      return(NULL)
    return(dir)
  })

  data <- reactiveValues()

  observeEvent(input$searchButton,{
    data$df <-  withProgress(message = 'Running...',
                             value=0,
                             {regex.ftn({dir()},input$regex1,input$regex2,progress = TRUE)}
    )

    output$table1 <- DT::renderDataTable(server = FALSE,{data$df},
                                         extensions = c('Buttons'),
                                         options = list(dom = 'Bfrtip',buttons = c('csv', 'excel')))

  })


}

shinyApp(ui, server)

data.dir <- "C:\\Text mining"
allfiles <- list.files(data.dir,pattern = ".txt")
parent.term <- "(pde)(\\s{0,1}:{0,1}\\s{0,1})(\\${0,1}[\\d,\\.]+)"
child.term <- "\\${0,1}([\\d\\.,])+"
output <- do.call("rbind", future_lapply(allfiles,function (x) regex_extract(data.dir,x,parent.term,child.term)))

Это содержимое файла, который я использую для тестирования: (test.txt)

"random random pde $350 random random"

И это ожидаемый результат:

     phrase context
1: pde $350     350
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...