2015-06-03 20 views
14

Ho un'app Shiny che utilizza la funzione read.xlsx dal pacchetto xlsx. Tutto funziona bene, ma voglio passare a readxl da readxl, sperando che sia più veloce e in grado di gestire file di grandi dimensioni."read_excel" in una app Shiny

ui parte:

fileInput("inputFile","Upload file...") 

server di parte:

data <- reactive({ 
    inFile <- input$inputFile 
    if (is.null(inFile)) { return(NULL) }  
    dataFile <- read_excel(inFile$datapath,sheet=1) 
    return(dataFile) 
    }) 

ottengo l'errore "Formato sconosciuto".

infile $ datapath è "/tmp/.../60974676c7287e913d1c0dc5/0"
infile $ tipo è "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"

Domanda 1: c'è un modo per dire a read_excel che si tratta di un file di tipo xlsx?
Domanda 2: è possibile controllare la posizione in cui verrà archiviato il file caricato?

+0

Avete provato nella console * R * con lo stesso file di input? – r2evans

+0

Sì, nella console R funziona. – polTo

risposta

15

Questo è un open issue con il pacchetto readxl. La soluzione alternativa disponibile è quella di copiare il percorso dei dati del file e aggiungere .xlsx. Ecco un esempio di lavoro sulla mia macchina limitato ai file .xlsx modificati per utilizzare file.rename anziché file.copy.

library(shiny) 
library(readxl) 

runApp(
    list(
     ui = fluidPage(
      titlePanel("Use readxl"), 
      sidebarLayout(
       sidebarPanel(
        fileInput('file1', 'Choose xlsx file', 
           accept = c(".xlsx") 
          ) 
        ), 
       mainPanel(
        tableOutput('contents')) 
       ) 
      ), 
     server = function(input, output){ 
      output$contents <- renderTable({ 
       inFile <- input$file1 

       if(is.null(inFile)) 
        return(NULL) 
       file.rename(inFile$datapath, 
          paste(inFile$datapath, ".xlsx", sep="")) 
       read_excel(paste(inFile$datapath, ".xlsx", sep=""), 1) 
      }) 
     } 
     ) 
    ) 
+0

Puoi semplicemente rinominarlo con 'file.rename'? Probabilmente dovrai pulire manualmente, ma è comunque necessario. – r2evans

+0

@ r2evans, grazie, 'file.rename' funziona, aggiornato. – cdeterman

+0

Funziona, grazie @cdeterman! – polTo

0

per garantire che l'utente non caricare un file .xlsx, o è necessario controllare l'estensione sei auto per passare tra le funzioni di lettura. È possibile estrarre l'estensione come segue:

library(shiny) 
library(readxl) 

runApp(
list(
    ui = fluidPage(
     titlePanel("Use readxl"), 
     sidebarLayout(
      sidebarPanel(
       fileInput('file1', 'Choose xlsx file', 
          accept = c(".xlsx") 
         ) 
       ), 
      mainPanel(
       tableOutput('contents')) 
      ) 
     ), 
    server = function(input, output){ 
     output$contents <- renderTable({ 
      inFile <- input$file1 

      if(is.null(inFile)) 
       return(NULL) 

      ext <- tools::file_ext(inFile$name) 
      file.rename(inFile$datapath, 
       paste(inFile$datapath, ext, sep=".")) 
      read_excel(paste(inFile$datapath, ext, sep="."), 1) 
     }) 
     } 
    ) 
)