J'ai une application Shiny qui utilise la fonction read.xlsx
du paquet xlsx
. Tout fonctionne bien, mais je souhaite passer de readxl
à read_Excel
, en espérant que ce serait plus rapide et capable de gérer des fichiers volumineux.
partie ui:
fileInput("inputFile","Upload file...")
partie serveur:
data <- reactive({
inFile <- input$inputFile
if (is.null(inFile)) { return(NULL) }
dataFile <- read_Excel(inFile$datapath,sheet=1)
return(dataFile)
})
Je reçois l'erreur "Format inconnu".
inFile $ datapath est "/tmp/.../60974676c7287e913d1c0dc5/0"
inFile $ type est "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Question 1: y a-t-il un moyen de dire à read_Excel
qu'il s'agit d'un fichier de type xlsx?
Question 2: est-il possible de contrôler l'emplacement où le fichier téléchargé sera stocké?
C'était un problème ouvert avec le paquetage readxl. La solution actuelle fournie consiste à copier le chemin de données du fichier et à ajouter .xlsx
. Voici un exemple de travail sur ma machine limité aux fichiers .xlsx
édités pour utiliser file.rename
au lieu de 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)
})
}
)
)
EDIT Notez qu'avec la version 1.1.0
de readxl
, le fichier ne doit plus être renommé. Ce qui suit fonctionne sans problème pour moi maintenant.
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({
req(input$file1)
inFile <- input$file1
read_Excel(inFile$datapath, 1)
})
}
)
)
pour vous assurer que l’utilisateur télécharge un fichier .xlsx ou vous devez vérifier l’extension que vous utilisez pour basculer entre les fonctions de lecture. Vous pouvez extraire l'extension comme suit:
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)
})
}
)
)