Я создал приложение, позволяющее пользователям вводить термины регулярного выражения, после чего оно будет искать термины в некоторых текстовых файлах и результаты поиска в таблице.
Код работает нормально из среды 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