2015-06-03 34 views
14

Mam aplikację Shiny, która korzysta z funkcji read.xlsx z pakietu xlsx. Wszystko działa dobrze, ale chcę zmienić na read_excel z readxl, mając nadzieję, że będzie szybszy i poradzi sobie z dużymi plikami."read_excel" w Shiny app

ui części: część

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

server:

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

uzyskać "Nieznany format" błąd.

plik_we $ DataPath jest "/tmp/.../60974676c7287e913d1c0dc5/0"
plik_we $ typ to "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"

Pytanie 1: czy istnieje sposób, aby powiedzieć read_excel, że jest to plik typu Xlsx?
Pytanie 2: czy można kontrolować lokalizację, w której będzie przechowywany przesłany plik?

+0

Czy wypróbowałeś go w konsoli * R * z tym samym plikiem wejściowym? – r2evans

+0

Tak, w konsoli R działa. – polTo

Odpowiedz

15

To jest open issue z pakietem readxl. Obecne obejście zapewnia kopiowanie ścieżki danych pliku i dołączanie .xlsx. Oto działający przykład na mojej maszynie ograniczony do plików .xlsx edytowanych do użycia file.rename zamiast 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

Czy możesz zmienić nazwę tego pliku za pomocą 'file.rename'? Prawdopodobnie będziesz musiał oczyścić ręcznie, ale i tak jest to konieczne. – r2evans

+0

@ r2evans, dziękuję, 'file.rename' działa, zaktualizowano. – cdeterman

+0

To działa, dziękuję @cdeterman! – polTo

0

w celu upewnienia się, że użytkownik przesyła plik .xlsx, lub musisz sprawdzić sam, czy chcesz zmienić swoje funkcje odczytu. Można wyodrębnić rozszerzenie w następujący sposób:

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) 
     }) 
     } 
    ) 
)