"read_excel" в приложении Shiny

У меня есть приложение Shiny, которое использует функцию read.xlsx из пакета xlsx. Все работает нормально, но я хочу перейти на read_excel с readxl, надеясь, что он будет быстрее и способен справляться с большими файлами.

ui part:

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

серверная часть:

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

Я получаю ошибку "Неизвестный формат".

inFile $datapath is "/tmp/.../60974676c7287e913d1c0dc5/0"
inFile $type - это "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"

Вопрос 1: есть ли способ сообщить read_excel, что это файл типа xlsx?
Вопрос 2: возможно ли управлять местоположением, в котором будет сохранен загруженный файл?

Ответы

Ответ 1

Это открытая проблема с пакетом readxl. Текущее обходное решение при условии, что необходимо скопировать путь данных файла и добавить .xlsx. Вот рабочий пример моей машины, ограниченный файлами .xlsx, отредактированными для использования file.rename вместо 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)
            })
        }
        )
    )

Ответ 2

чтобы пользователь загрузил файл .xlsx или вам нужно проверить расширение, которое вы сами должны переключаться между функциями чтения. Вы можете извлечь расширение следующим образом:

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