Skip to contents

Creating a dynamic quiz can make it more engaging and challenging for users. The create_question_random() function in shinyquiz allows you to generate random questions. This vignette will guide you through how to use this function effectively.

The create_question_random() function takes two main arguments:
- .f: A function that generates a single random question.
- n: The number of random questions to generate for the quiz.


Creating a Random Question Generator

Before you can use create_question_random(), you’ll need to create a function that generates a single random question. This function should return a question object created by create_question() or create_question_raw().

Here’s an example that generates a random question about whether a number is even or odd:

random_question <- function() {
  number <- round(rnorm(1, 30, 10), 0)
  rand_prompt <- paste('Is', number, 'an even number?')

  q <- create_question(
    prompt = rand_prompt,
    add_choice('Yes, it is even', correct = number %% 2 == 0),
    add_choice('No, it is odd', correct = number %% 2 != 0)
  )

  return(q)
}

You can test your function by running it a few times and verifying the preview changes each time.

random_question()
random_question()

Putting It All Together

Once you have your random question generator function, you can pass it to create_question_random() along with the number of questions you want to generate.

create_quiz(
  create_question_random(.f = random_question, n = 20)
)

This will create a quiz with 20 randomly generated questions about whether numbers are even or odd.


Randomizing on-the-fly

Pre-Created vs. Dynamic Quizzes

When you run create_question_random() outside of a Shiny server function, the set of questions it generates is fixed at that moment. This means that if you deploy a Shiny application with this pre-created quiz, every user will see the same set of questions.

# Pre-created quiz
my_quiz <- create_quiz(
  create_question_random(.f = random_question, n = 20)
)

Dynamic Randomization within Shiny Server

To generate a new set of questions for each user or session, you can include create_question_random() within your Shiny app’s server function. This way, the function will re-execute each time a new user accesses the app, providing a unique set of questions.

# create static quiz for the ui side
# this is required to match the namespace
quiz <- create_quiz(
  create_question_random(.f = random_question, n = 20)
)

# build the shiny UI
ui <- shiny::fluidPage(
  htmltools::div(
    style = "max-width: 700px",
    quiz_ui(quiz)
  )
)

# build the server
server <- function(input, output, session) {
  # create the dynamic quiz
  quiz <- create_quiz(
    create_question_random(.f = random_question, n = 20)
  )
  
  # run the quiz server
  quiz_server(quiz)
}

# run the app
shiny::shinyApp(ui, server)

By placing create_question_random() inside the server function, you ensure that the quiz is dynamic, offering a different experience for each user or at different times.


Additional Information

Note that the presence of a random question in a quiz will automatically set the quiz option of sandbox = TRUE. This triggers the quiz to no longer end on the first wrong question, removes the progress bar along the top, and the grade calculation excludes any unattempted questions. You can override this behavior with set_quiz_options(override = TRUE).

You may mix and match random and regular questions. The following will create a quiz that starts with one static question and then follows with 20 random ones.

create_quiz(
  create_question(
    prompt = 'My prompt explaining what the ATC of this thing should be',
    add_slider(0, 30, 15, correct = 10)
  ),
  create_question_random(.f = random_question, n = 20)
)


That’s it! Be sure to check out the documentation for create_question_random() for more information.