2016-04-06 12 views
3

Ich habe gerade angefangen, Shiny zu lernen. Ich habe versucht, eine einfache, nicht reaktive App zu erstellen, bei der der Benutzer auf eine Schaltfläche klickt und ein zufälliger Vektor auf den Bildschirm gedruckt wird. Ich kann jedoch den Absenden-Button nicht funktionieren lassen.Shiny submitButton funktioniert nicht

# Load required files 
lapply(c("data.table", "shiny"), require, character.only=T) 

#================================================================= 
# Define UI for application that draws a histogram 

ui <- shinyUI(fluidPage(

    # Application title 
    titlePanel("App-4"), 

    # Sidebar 
    sidebarLayout(
     sidebarPanel(
     submitButton("Submit") 
    ), 

     # Print the data 
     mainPanel(
     textOutput("myTable") 
    ) 
    ) 
)) 

#================================================================= 
# Define server logic 

server <- shinyServer(function(input, output) { 
    output$myTable <- renderPrint({ 
    sample(10) 
    }) 
}) 

#================================================================= 

# Run the application 
shinyApp(ui = ui, server = server) 

Was mache ich falsch? Ich konnte dies mit einer actionButton arbeiten, aber ich würde gerne verstehen, warum der obige Code nicht funktioniert. Vielen Dank.

+1

„Wenn ein submitButton in einer glänzenden Anwendung vorhanden ist, verursacht es alle Eingaben auf der Seite nicht Aktualisierungen an den Server zu senden, bis die Taste gedrückt wird.“ Sie haben keine Eingaben, die aktualisiert werden müssen. – cory

+1

Verwenden Sie 'actionButton' anstelle von' submitButton', verwenden Sie auch 'observeEvent' im Servercode. –

+0

@cory Also, als Neuling zu Shiny, was ist der beste Designansatz, um so etwas zu erreichen? I.e. um eine App ohne Eingaben zu erstellen, aber immer noch eine Schaltfläche, die bei jedem Klick zufällig eine neue Datenmenge abfragt/mischt. Ist 'actionButton' der richtige Weg? – Ben

Antwort

1

Hier ist eine sehr einfache Demo. Wenn Sie auf die Schaltfläche klicken, wird ein neues Histogramm mit 100 Zufallszahlen erstellt.

submitButton ist für die Verwendung mit einem Eingabeformular gedacht und nicht für Ihre Anforderung. Wenn Sie beispielsweise vier verschiedene Eingaben haben und möchten, dass sich die Ausgabe NUR ändert, wenn Sie auf die Schaltfläche zum Senden klicken, und nicht wenn sich eine einzelne Eingabe ändert.

In Shiny werden Ausgabeänderungen durch eine Kette von Ereignissen verursacht. Ihre Ausgabe muss von einer oder mehreren Eingaben abhängig sein, um Änderungen vornehmen zu können. Im Moment hängt Ihre Ausgabe (Server-Code) nicht von irgendeiner Eingabe ab, daher wird nichts passieren. Lesen Sie hier für eine sehr detaillierte Erklärung. http://shiny.rstudio.com/articles/reactivity-overview.html

library(shiny) 

# Define UI for application that draws a histogram 
ui <- shinyUI(fluidPage(

    # Application title 
    titlePanel("Button demo"), 

    # Sidebar with a button 
    sidebarLayout(
     sidebarPanel(
     actionButton("button", "Click me to get a new histogram") 
    ), 

     # Show a plot of the generated distribution 
     mainPanel(
     plotOutput("distPlot") 
    ) 
    ) 
)) 

# Define server logic required to draw a histogram 
server <- shinyServer(function(input, output) { 

    observeEvent(input$button, { 
    output$distPlot <- renderPlot({ 
     hist(rnorm(100)) 
    }) 
    }) 
}) 

# Run the application 
shinyApp(ui = ui, server = server) 
Verwandte Themen