{shinysurveys} provides easy-to-use, minimalistic code for creating and deploying surveys in R. It extends the {shiny} package and converts a table of questions into an interactive web-based application. Administering surveys with this package allows users to combine the computational tools of R with the interactivity of web applications. This helps bridge the gap between data collection and data analysis.


You can install {shinysurveys} via CRAN or GitHub and load it as follows:

# Install released version from CRAN

# Or, install the development version from GitHub

# Load package

Basic Survey

{shinysurveys} exports two functions: surveyOutput() and renderSurvey(). The former goes in the UI portion of a Shiny app, and the latter goes in the server portion. To create a survey, you can build a data frame with your questions. The following columns are required.

  • question: The question to be asked.
  • option: A possible response to the question. In multiple choice questions, for example, this would be the possible answers. For questions without discrete answers, such as a numeric input, this would be the default option shown on the input. For text inputs, it is the placeholder value.
  • input_type: What type of response is expected? Currently supported types include numeric, mc for multiple choice, text, select, and y/n for yes/no questions.
  • input_id: The id for Shiny inputs.
  • dependence: Does this question (row) depend on another? That is, should it only appear if a different question has a specific value? This column contains the input_id of whatever question this one depends upon.
  • dependence_value: This column contains the specific value that the dependence question must take for this question (row) to be shown.
  • required: logical TRUE/FALSE signifying if a question is required. Surveys can only be submitted when all required questions are answered.

A demo survey can be created as follows:


df <- data.frame(question = "What is your favorite food?",
                 option = "Your Answer",
                 input_type = "text",
                 input_id = "favorite_food",
                 dependence = NA,
                 dependence_value = NA,
                 required = F)

ui <- fluidPage(
  surveyOutput(df = df,
               survey_title = "Hello, World!",
               survey_description = "Welcome! This is a demo survey showing off the {shinysurveys} package.")

server <- function(input, output, session) {
  observeEvent(input$submit, {
      title = "Congrats, you completed your first shinysurvey!",
      "You can customize what actions happen when a user finishes a survey using input$submit."

shinyApp(ui, server)

In the browser, this looks like:

Further Reading

For a more in-depth explanation of {shinysurveys}, please see the vignette A survey of {shinysurveys}.