2015-01-04 9 views
8

Sto sperimentando con Shiny e lo adoro. Ho creato una piccola applicazione in cui gli studenti caricano un file CSV e quindi scelgono variabili dipendenti e variabili indipendenti e quindi R calcola una regressione lineare. Funziona bene. Ce l'ho caricato su:Lucido: Mostra i pulsanti solo dopo che il file è stato caricato

http://carlosq.shinyapps.io/Regresion

[È possibile utilizzare this file di provarlo, se si desidera. "Birra" è la variabile dipendente e il resto delle variabili tranne "id" sono la indipendenti]

Ecco server.R:

# server.R 
library(shiny) 

shinyServer(function(input, output) { 

    filedata <- reactive({ 
    infile <- input$file1 
    if (is.null(infile)){ 
     return(NULL)  
    } 
    read.csv(infile$datapath) 
    }) 

    output$dependent <- renderUI({ 
    df <- filedata() 
    if (is.null(df)) return(NULL) 
    items=names(df) 
    names(items)=items 
    selectInput("dependent","Select ONE variable as dependent variable from:",items) 
    }) 


    output$independents <- renderUI({ 
    df <- filedata() 
    if (is.null(df)) return(NULL) 
    items=names(df) 
    names(items)=items 
    selectInput("independents","Select ONE or MANY independent variables from:",items,multiple=TRUE) 
    }) 


    output$contents <- renderPrint({ 
    input$action 
    isolate({ 
     df <- filedata() 
     if (is.null(df)) return(NULL) 
     fmla <- as.formula(paste(input$dependent," ~ ",paste(input$independents,collapse="+"))) 
     summary(lm(fmla,data=df)) 
    }) 
    }) 

}) 

Ed ecco l'ui.R:

# ui.R 
library(shiny) 

shinyUI(fluidPage(
    titlePanel("Multiple Linear Regression"), 
    sidebarLayout(
    sidebarPanel(
     fileInput('file1', 'Choose CSV File', 
       accept=c('text/csv', 
         'text/comma-separated-values,text/plain', 
         '.csv')), 

     tags$hr(), 
     uiOutput("dependent"), 
     uiOutput("independents"), 
     tags$hr(), 
     actionButton("action", "Press after reading file and selecting variables") 

    ), 
    mainPanel(
     verbatimTextOutput('contents') 
    ) 
) 
)) 

La mia domanda è: Voglio rendere l'aspetto del pulsante "Premere dopo aver letto il file e selezionare le variabili" subordinatamente al caricamento riuscito.

ho cercato di usare il suggerimento qui contenute:

Make conditionalPanel depend on files uploaded with fileInput

Ma non riesco proprio a farlo funzionare.

Appagisco qualsiasi aiuto.

risposta

7

Questo codice ha funzionato per me

ui.R

# ui.R 
library(shiny) 

shinyUI(fluidPage(
    titlePanel("Multiple Linear Regression"), 
    sidebarLayout(
    sidebarPanel(
     fileInput('file1', 'Choose CSV File', 
       accept=c('text/csv', 
         'text/comma-separated-values,text/plain', 
         '.csv')), 

     tags$hr(), 
     uiOutput("dependent"), 
     uiOutput("independents"), 
     tags$hr(), 
     uiOutput('ui.action') # instead of conditionalPanel 
    ), 
    mainPanel(
     verbatimTextOutput('contents') 
    ) 
) 
)) 

server.R

# server.R 
library(shiny) 

shinyServer(function(input, output) { 

    filedata <- reactive({ 
    infile <- input$file1 
    if (is.null(infile)){ 
     return(NULL)  
    } 
    read.csv(infile$datapath) 
    }) 

    output$dependent <- renderUI({ 
    df <- filedata() 
    if (is.null(df)) return(NULL) 
    items=names(df) 
    names(items)=items 
    selectInput("dependent","Select ONE variable as dependent variable from:",items) 
    }) 


    output$independents <- renderUI({ 
    df <- filedata() 
    if (is.null(df)) return(NULL) 
    items=names(df) 
    names(items)=items 
    selectInput("independents","Select ONE or MANY independent variables from:",items,multiple=TRUE) 
    }) 


    output$contents <- renderPrint({ 
    input$action 
    isolate({ 
     df <- filedata() 
     if (is.null(df)) return(NULL) 
     fmla <- as.formula(paste(input$dependent," ~ ",paste(input$independents,collapse="+"))) 
     summary(lm(fmla,data=df)) 
    }) 
    }) 


    output$ui.action <- renderUI({ 
    if (is.null(input$file1)) return() 
    actionButton("action", "Press after reading file and selecting variables") 
    }) 

}) 
+0

Grazie Marat. Ho provato la tua soluzione. Fa sparire il bottone ... e va bene. Ma non appare dopo aver caricato il file. Ho dimenticato il file server.R include una riga che controlla se il file è stato caricato correttamente. – user23438

+0

@ user23438, non sono riuscito a ottenere la soluzione usando 'conditionPanel', perché non sapevo come impostare correttamente' condition'. Ho modificato la risposta, che ora si basa su uiOutput. –

+0

Grazie ancora Marat per il tuo tempo. La tua nuova soluzione mi avvicina alla soluzione. Ora il pulsante appare al momento giusto, ma crea un problema con i miei contenuti $ di output. Prima ho avuto il codice in questa sezione avvolto in "isolate ({})" che è stato attivato da input $ azione. Ora l'azione $ input è scomparsa perché il pulsante è scomparso. Potrei sbarazzarmi di isolare ma poi stampa spazzatura finché non vengono selezionate le variabili giuste. – user23438

9

Qui basa la working ShinyApp e la versione finale di entrambi ui.R e server.R su tutti i suggerimenti forniti da Marat.

Prima i ui.R

# ui.R 

library(shiny) 

shinyUI(fluidPage(
    titlePanel("Multiple Linear Regression with R/Shiny"), 
    sidebarLayout(
    sidebarPanel(
     p("Please upload a CSV formatted file with your data."), 
     fileInput('file1', label='Click button below to select the file in your computer.', 
       accept=c('text/csv', 
         'text/comma-separated-values,text/plain', 
         '.csv')), 

     tags$hr(), 
     uiOutput("dependent"), 
     uiOutput("independents"), 
     tags$hr(), 
     uiOutput('ui.action') # instead of conditionalPanel 
    ), 
    mainPanel(
     p("Here's the output from your regression:"), 
     verbatimTextOutput('contents') 
    ) 
) 
)) 

e server.R

# server.R 

library(shiny) 

shinyServer(function(input, output) { 

    filedata <- reactive({ 
    infile <- input$file1 
    if (is.null(infile)){ 
     return(NULL)  
    } 
    read.csv(infile$datapath) 
    }) 

    output$ui.action <- renderUI({ 
    if (is.null(filedata())) return() 
    actionButton("action", "Run regression") 
    }) 

    output$dependent <- renderUI({ 
    df <- filedata() 
    if (is.null(df)) return(NULL) 
    items=names(df) 
    names(items)=items 
    selectInput("dependent","Now select ONE variable as dependent variable from:",items) 
    }) 


    output$independents <- renderUI({ 
    df <- filedata() 
    if (is.null(df)) return(NULL) 
    items=names(df) 
    names(items)=items 
    selectInput("independents","Also select ONE or MANY independent variables in the box below. You can change your selection several times:",items,multiple=TRUE) 
    }) 


    output$contents <- renderPrint({ 
    if (is.null(input$action)) return() 
    if (input$action==0) return() 
    isolate({ 
     df <- filedata() 
     if (is.null(df)) return(NULL) 
     fmla <- as.formula(paste(input$dependent," ~ ",paste(input$independents,collapse="+"))) 
     summary(lm(fmla,data=df)) 
    }) 
    }) 


}) 

Ancora una volta grazie per il vostro aiuto Marat.

+0

Prego! –