R Shiny - загрузка нескольких CSV работает локально, но не на shinyapps.io - PullRequest
0 голосов
/ 16 сентября 2018

Я создал приложение, которое позволяет пользователю загружать несколько файлов CSV.

Затем эти csvs объединяются в 'rbind', 'read.csv' и к df добавляется столбец, который является именем файла.

Затем обрабатывается df для создания различных графиков, которые можно загрузить. Это работает идеально локально, но не при развертывании. Я повторил ошибку с кодом ниже:

Предупреждение в файле (file, "rt"): невозможно открыть файл '* .csv': такого файла или каталога нет

Предупреждение: ошибка в файле: не удается открыть соединение

Пользовательский интерфейс:

    dashboardPage( skin = "black",
   dashboardHeader(title = "myApp"),
   dashboardSidebar(collapsed = TRUE,
   sidebarMenu(
    menuItem("Home", tabName = "dashboard1", icon = icon("home", lib = 
  "glyphicon"))
    ) 
    ),
   dashboardBody(
     tags$head(tags$style(HTML('
      .main-header .logo {
                          font-family: "Times New Roman", serif;
                          font-weight: bold;
                          font-size: 24px;
                          }
                          '))),

tabItems(
  tabItem(tabName = "dashboard1",
          fileInput("file1",
                    label="Input files:",
                    multiple = TRUE),
          downloadButton('plot.pdf', 'Download Data')
  )
  )

)
)

Сервер:

     library(shiny)
     library(shinydashboard)

     #server start
     function(input, output) {

       testinput<- reactive({
if(is.null(input$file1))
  return ()
else 
{
  nfiles = nrow(input$file1) 
  csv = list()
  for (i in 1 : nfiles)
  {

    csv[[i]] = read.csv(input$file1$datapath[i])

  }

  csv_names <- input$file1[['name']]
  mydata <- do.call(rbind, lapply(csv_names, function(x) cbind(read.csv(x), name=strsplit(x,'\\.')[[1]][1])))
  View(mydata)
    }
   })

     output$plot.pdf <- downloadHandler(
    filename = function() {
     "plot.pdf"
    },
    content = function(file) {
      withProgress(message = 'Your file is downloading',
               detail = 'This may take a minute or two...', value = 0, {
                 for (i in 1:10) {
                   incProgress(1/10)
                   Sys.sleep(0.5)}

                 pdf(file)
                 print(testinput())
                 dev.off()

               })
 }

 )


   }

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

Пожалуйста, помогите

1 Ответ

0 голосов
/ 18 сентября 2018

Вы не должны использовать csv_names <- input$file1[['name']] в своем server, это только возвращает имя файла, а не путь к файлу, поэтому при использовании read.csv для чтения файла CSV произошла ошибка.

Следующее должно работать нормально.

пользовательский интерфейс

library(shiny)
library(shinydashboard)


dashboardPage( skin = "black",
               dashboardHeader(title = "myApp"),
               dashboardSidebar(collapsed = TRUE,
                                sidebarMenu(
                                  menuItem("Home", tabName = "dashboard1", icon = icon("home", lib = 
                                                                                         "glyphicon"))
                                ) 
               ),
               dashboardBody(
                 tags$head(tags$style(HTML('
      .main-header .logo {
                          font-family: "Times New Roman", serif;
                          font-weight: bold;
                          font-size: 24px;
                          }
                          '))),

                 tabItems(
                   tabItem(tabName = "dashboard1",
                           fileInput("file1",
                                     label="Input files:",
                                     multiple = TRUE),
                           downloadButton('plot.pdf', 'Download Data')
                   )
                 )

               )
)

сервер

library(shiny)
library(shinydashboard)

#server start
function(input, output) {

  testinput<- reactive({
    if(is.null(input$file1))
      return ()
    else 
    {
      nfiles = nrow(input$file1) 
      csv = list()
      for (i in 1 : nfiles)
      {

        csv[[i]] = read.csv(input$file1$datapath[i])

      }

      csv_names <- input$file1$datapath
      mydata <- do.call(rbind, lapply(csv_names, function(x) cbind(read.csv(x), name=strsplit(basename(x),'\\.')[[1]][1])))
      mydata
    }
  })

  output$plot.pdf <- downloadHandler(
    filename = function() {
      "plot.pdf"
    },
    content = function(file) {
      withProgress(message = 'Your file is downloading',
                   detail = 'This may take a minute or two...', value = 0, {
                     for (i in 1:10) {
                       incProgress(1/10)
                       Sys.sleep(0.5)}

                     pdf(file)
                     plot(testinput()[,1])
                     dev.off()

                   })
    }        
  )   
}
...