2016-07-11 16 views
2

Ich versuche eine Schritt für Schritt App mit Shiny zu bauen. Mein Ziel ist es, ein Examen zu erstellen, das aus einer Reihe von Fragen besteht, die in einer Datenbank gespeichert sind. Was ich brauche ist eine "nächste" Schaltfläche, die beim Klicken auf eine andere Frage angezeigt wird."Next" -Taste in einer R Shiny App

Ich habe mit einem "action button" triying, aber es funktioniert nur das erste Mal, das heißt, das erste Mal, wenn es angeklickt wird, erscheint eine Frage, aber es wird unclickable einmal zum ersten Mal geklickt (es tut nicht arbeite nicht als "nächster Knopf", wie ich es wünsche. Hier

ist der Code:

Server.R:

library(xlsx) 
data<-read.xlsx("data/base.xlsx",sheetName="Full1") 

shinyServer(function(input, output) { 

    data[,2]<-as.character(data[,2]) 

    question<-data[2,2] 

    ntext <- eventReactive(input$goButton, { 
    question 
    }) 

    output$nText <- renderText({ 
    ntext() 
    }) 
}) 

ui.R:

shinyUI(pageWithSidebar(
    headerPanel("Exam"), 
    sidebarPanel(
    actionButton("goButton", "Next"), 
    p("Next Question") 
), 
    mainPanel(
    verbatimTextOutput("nText") 
) 
)) 

Thank you so much.

+0

Bitte geben Sie ein reproduzierbares Beispiel –

+0

Sorry, ich habe meine Frage aktualisiert. –

Antwort

2

Sie können so etwas tun. Bitte beachten Sie die Kommentare im Code

rm(list = ls()) 
library(shiny) 
questions <- c("What is your name?","Can you code in R?","Do you find coding fun?","Last Question:How old are you?") 

ui <- pageWithSidebar(
    headerPanel("Exam"), 
    sidebarPanel(actionButton("goButton", "Next"),p("Next Question")), 
    mainPanel(verbatimTextOutput("nText"))) 

server <- function(input, output,session) { 

    # Inititating reactive values, these will `reset` for each session 
    # These are just for counting purposes so we can step through the questions 
    values <- reactiveValues() 
    values$count <- 1 

    # Reactive expression will only be executed when the button is clicked 
    ntext <- eventReactive(input$goButton,{ 

    # Check if the counter `values$count` are not equal to the length of your questions 
    # if not then increment quesions by 1 and return that question 
    # Note that initially the button hasn't been pressed yet so the `ntext()` will not be executed 
    if(values$count != length(questions)){ 
     values$count <- values$count + 1 
     return(questions[values$count]) 
    } 
    else{ 
     # otherwise just return the last quesion 
     return(questions[length(questions)]) 
    } 
    }) 

    output$nText <- renderText({ 
    # The `if` statement below is to test if the botton has been clicked or not for the first time, 
    # recall that the button works as a counter, everytime it is clicked it gets incremented by 1 
    # The initial value is set to 0 so we just going to return the first question if it hasnt been clicked 
    if(input$goButton == 0){ 
     return(questions[1]) 
    } 
    ntext() 
    }) 
} 
shinyApp(ui = ui, server = server) 
+0

Könnten Sie bitte vielleicht eine oder zwei Zeilen schreiben, die Ihren Code funktionsfähig machen? Für mich sieht es aus wie "kopiere und füge das ein und Magie wird passieren" - wenn du weißt was ich meine. – Michal

+0

Sie meinen, beschreiben Sie einfach den Code ein bisschen? –

+0

Genau, denn auch wenn es dem OP helfen könnte, verstehen andere vielleicht nicht, was vor sich geht, obwohl Ihre Lösung gut funktioniert. – Michal