Извлеките текст из имени файла в блестящем приложении и добавьте его во фрейм данных перед записью на локальный компьютер - PullRequest
0 голосов
/ 06 января 2020

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

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

##### function to read tab-separated flat file(s) while adding a string from the filename to a column in the table
my_read_tsv <- function(x) {
  out <- read_tsv(x, skip = 4) ## skips for header lines
  id_code <-
    paste(
      str_extract(x, "[0-9]{1,6}), 
      str_extract(x, "[A-Za-z0-9]{1,3}-[A-Za-z0-9]{1,2}_[A-Za-z0-9]{1,3}")
    )
  cbind(ID = id_code, out)
}

в моем скрипте. Я определяю функцию и затем вызываю ее, как показано ниже

tbl <- lapply(desiredlist, my_read_tsv) %>% bind_rows()

ниже - это то, что мне удалось получить частично, но столбец «id» заполнен значениями «NANA».

#
# This is a Shiny web application. You can run the application by clicking
# the 'Run App' button above.
#
# Find out more about building applications with Shiny here:
#
#    http://shiny.rstudio.com/
#

library(shiny)

ui <- fluidPage(
    fluidPage(
        titlePanel("Combine files"),
        sidebarLayout(
            sidebarPanel(
                fileInput("fileinput",
                          "Choose files from a directory",
                          multiple = TRUE,
                          accept=c('text/csv', 
                                   'text/comma-separated-values,text/plain', 
                                   '.csv')),
                downloadButton('downloadData', 'Download')
            ),
            mainPanel(
                tableOutput('contents')
            )
        )
    )
)

library(shiny)
library(dplyr)
library(readr)
library(tidyr)
library(stringr)

options(shiny.maxRequestSize = 200*1024^2) ## scales file size above 5mb limit
server <-  function(input, output) {
    getData <- reactive({
        inFile <- input$fileinput
        if (is.null(inFile)){
            return(NULL)
        }else {  
            csvfiles <- lapply(inFile$datapath, function(y){
                    out <- read_tsv(y, skip = 4)
                    id_code <-
                        paste(
                            str_extract(y,"WR[0-9]{1,6}"),
                            str_extract(y, "[A-Za-z0-9]{1,3}-[A-Za-z0-9]{1,2}_[A-Za-z0-9]{1,3}")
                        )
                    cbind(ID = id_code, out)
                }
            )
            do.call(bind_rows, csvfiles)
        }
    })
    output$contents <- renderTable( 
        getData() 
    )
    output$downloadData <- downloadHandler(
        filename = function() { 
            paste("combined_file", ".csv", sep="")
        },
        content = function(file) { 
            write.csv(getData(), file, row.names=FALSE)   
        })
}

shinyApp(ui = ui, server = server)

Пример данных имеет 4 строки заголовка, затем заголовки строк, затем числовые данные в столбцах 1: 6

EX:
header
header
header 
header
row.names 
1   2    3    4    5    6
1   2    3    4    5    6 
...