2015-01-04 14 views
8

Ich experimentiere mit Shiny und ich liebe es. Ich habe eine kleine Anwendung erstellt, wo Schüler eine CSV-Datei hochladen und dann eine abhängige Variablen und unabhängige Variablen auswählen und dann berechnet R eine lineare Regression. Es funktioniert gut. Ich habe es hochgeladen an:Shiny: Schaltflächen nur anzeigen, nachdem die Datei hochgeladen wurde

http://carlosq.shinyapps.io/Regresion

[Sie this file verwenden können, um es zu testen, wenn Sie wollen. "Bier" ist die abhängige Variable und der Rest der Variablen mit Ausnahme von "id" sind die unabhängige]

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

}) 

Und hier ist der 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') 
    ) 
) 
)) 

Meine Frage ist: Ich möchte die Schaltfläche "Drücken Sie nach dem Lesen der Datei und die Auswahl der Variablen" Bedingung für ein erfolgreiches Hochladen machen.

Ich habe versucht, den Vorschlag hier enthalten sind, zu verwenden:

Make conditionalPanel depend on files uploaded with fileInput

Aber ich kann es einfach nicht funktioniert.

Ich appreaciate jede Hilfe.

Antwort

7

Dieser Code funktioniert für mich

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

Danke Marat. Ich habe deine Lösung versucht. Es lässt den Knopf verschwinden ... und das ist gut. Aber es erscheint nicht nach dem Hochladen der Datei. I asumme Ihre Server.R-Datei enthält eine Zeile, die überprüft, ob die Datei erfolgreich hochgeladen wurde. – user23438

+0

@ user23438, konnte ich die Lösung mit dem 'conditionPanel' nicht bekommen, weil ich nicht wusste, wie man' condition' richtig einrichtet. Ich habe die Antwort bearbeitet, die nun auf dem uiOutput basiert. –

+0

Nochmals vielen Dank Marat für Ihre Zeit. Ihre neue Lösung bringt mich näher an die Lösung heran. Jetzt erscheint die Schaltfläche im richtigen Moment, aber es erzeugt ein Problem mit meiner Ausgabe $ contents. Zuvor hatte ich den Code in diesem Abschnitt in "isolate ({})" eingepackt, das durch die Eingabe $ action aktiviert wurde. Jetzt ist die Eingabe $ action weg, weil die Schaltfläche weg ist. Ich könnte Isolat loswerden, aber dann druckt es Müll, bis die richtigen Variablen ausgewählt sind. – user23438

9

Hier ist die working ShinyApp und die endgültige Version von sowohl ui.R und server.R Basis zu allen Vorschlägen von Marat.

Zuerst werden die 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') 
    ) 
) 
)) 

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


}) 

Noch einmal vielen Dank für Ihre Hilfe Marat.

+0

Gern geschehen! –