2016-07-11 11 views
2

シャイニーを使ってステップバイステップのビルドをしようとしています。私の目的は、データベースに書かれた一連の質問で構成された試験を作成することです。私が必要とするのは、別の質問をクリックすると表示される「次へ」ボタンです。Rシャイニーアプリの「次へ」ボタン

私は「アクションボタン」でトライアンドしていますが、最初に動作します。つまり、初めてクリックされたときに表示されますが、初めてクリックされたときは解除できなくなります私が望むように、 "次のボタン"として働く)。ここで

コードです:

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") 
) 
)) 

ありがとうございました。

+0

のコメントは –

+0

申し訳ありませんが、私は私の質問を更新した再現性の例を提供してくださいますのでご注意ください。 –

答えて

2

このようなことができます。コード

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

コードを機能させるために、1行か2行書くことができますか?私には、「コピーして貼り付けて、魔法が起こる」のように見えます。 – Michal

+0

コードをちょっとだけ説明するのですか? –

+0

まあ、それはOPを助けるかもしれないが、あなたのソリューションがうまくいっても、何が起こっているのか理解できない人がいるかもしれないからです。 – Michal

関連する問題