2017-03-27 1 views
0

Je n'arrive pas à faire fonctionner correctement la fonction de téléchargement de fichier lorsque j'utilise une barre de navigation. Voici ce que j'ai pour server.R:Le téléchargement de fichier ne fonctionne pas avec la barre de navigation dans R Shiny

library(shiny) 
library(markdown) 

function(input, output) { 

    df <- NULL 
    current_file <- NULL 
    in_data <- reactive({ 
    inFile <- input$file1 
    if (is.null(inFile)){ 
    return(NULL)}  
else {df <<- read.csv(inFile$datapath, header=input$header, sep=input$sep, 
        quote=input$quote) 
     current_file <<- inFile$name 
} 

return(NULL) 
    }) 


output$fileInfo <- renderTable({ 
call.me = in_data() 
data.frame(current_file) 
}) 




} 

Et pour ui.RI ont ceci:

library(shiny) 
library(markdown) 

navbarPage('Navigation Bar', 
     tabPanel('File Information', verbatimTextOutput('fileInfo'), 
       sidebarLayout(
        sidebarPanel(fileInput('file1', 'Choose CSV File', 
             accept=c('text/csv', 
                'text/comma-separated-values,text/plain', 
                '.csv')), 
        checkboxInput('header', 'Header', TRUE), 
        radioButtons('sep', 'Separator', 
           c(Comma=',', 
            Semicolon=';', 
            Tab='\t'), 
           ','), 
        radioButtons('quote', 'Quote', 
           c(None='', 
            'Double Quote'='"', 
            'Single Quote'="'"), 
           '"'), 
        tags$hr()), 
        mainPanel() 
       ))) 

Je veux éventuellement avoir plusieurs onglets dans la barre de navigation, et je veux être en mesure pour accéder aux données de chaque onglet. Tout ce que je cherche à faire maintenant, c'est de me donner le nom du fichier téléchargé. Cela fonctionne très bien lorsque je n'essaie pas d'ajuster la barre de navigation. Mais maintenant, cela ressemble à une sorte de sortie HTML. Des conseils? Très appréciée.

Répondre

0

C'est une très mauvaise idée d'obtenir l'utilisation de l'affectation globale <<- ici. Vos données seront globalement disponibles pour l'ensemble de l'application si vous utilisez un réactif - qui est la façon dont le brillant est destiné à être utilisé.

De même, regardez shiny::validate (exemple d'utilisation ci-dessous) pour valider les entrées.

library("shiny") 

options(shiny.maxRequestSize = 9*1024^2) 

server <- function(input, output) { 

    # the data read in by read.csv will now be accessible throughout the app 
    # by calling this reactive, e.g. in_data(). 
    in_data <- reactive({ 
    shiny::validate(
     need(input$file1, "Select a file!") 
    ) 

    read.csv(input$file1$datapath, header = input$header, 
      sep = input$sep, quote = input$quote) 
    }) 

    # an example, we're calling the reactive to access the data loaded 
    output$file_info <- renderTable({ 
    data.frame(in_data()) 
    }) 

} 

ui <- navbarPage('Navigation Bar', 
    tabPanel('File Information', verbatimTextOutput('fileInfo'), 
    sidebarLayout(
     sidebarPanel(
     fileInput('file1', 'Choose CSV File', accept = c('text/csv', 'text/comma-separated-values,text/plain', '.csv')), 
     checkboxInput('header', 'Header', TRUE), 
     radioButtons('sep', 'Separator', c(Comma = ',', Semicolon = ';', Tab = '\t'), ','), 
     radioButtons('quote', 'Quote', c(None = '', 'Double Quote'='"', 'Single Quote' = "'"),'"'), 
     tags$hr() 
     ), 
     mainPanel(
     tableOutput("file_info") 
     ) 
    ) 
    ) 
) 

shinyApp(ui, server) 

enter image description here

+0

Merci! Je suis assez nouveau à R Shiny. Pourquoi l'utilisation de variables globales est-elle une mauvaise idée? –

+0

Il y a des cas où vous voulez utiliser des globals (voir http://rstudio.github.io/shiny/tutorial/#scoping) mais dans ce cas, vous ne voulez surtout pas que les données d'une session persistent dans une autre. Il peut en résulter des choses vraiment bizarres en fonction de ce que vous faites avec les données après leur chargement. Par exemple, des calculs erronés pourraient être exécutés avec les anciennes données et l'utilisateur n'aurait aucune idée – mlegge