Создайте простой вопрос и ответ в R markdown

#r #shiny

#r #блестящий

Вопрос:

Я пытаюсь создать интерактивный документ, в котором учащиеся могут вводить свои ответы на домашние задания.

 output:
  html_document:
    toc: true
    toc_float:
      collapsed: true
      smooth_scroll: false
    toc_depth: 4
    theme: yeti 
    highlight: tango
runtime: shiny
  

Я хочу задать простой вопрос «Введите все возможные пути разрыва».
Правильными ответами будут c("ABEF","ABCDG","ABCDEF","ABDEF")
Я хочу, чтобы студент мог отправлять как можно больше материалов, пока не получит все четыре правильных ответа.

Я очень новичок в shiny, и это моя попытка только начать его.

 ```{r letter-a, echo=FALSE}
library(shiny)
ui <- fluidPage(
  textInput('answer', label = 'Input all possible rupture paths', width = '30%'),
  actionButton("go", "Submit!"),
  uiOutput('feedback')
)

shinyUI(UI)
```
  

Это запускается и создает окно, я не знаю, как определить правильный ответ и сравнить отправленный ответ с правильными.

введите описание изображения здесь

Спасибо!! Любая помощь приветствуется!!

Ответ №1:

Вы можете попробовать использовать learnr . Это сэкономит вам много времени и хлопот.

Чтобы ответить на ваш вопрос, было бы полезно создать интерактивный документ, который выглядит как блестящий. Для этого вам просто нужно будет создать файл Rmd. Просто сохраните файл с помощью .Расширение Rmd.

Основываясь на вашем вопросе, я попытался воссоздать сценарий с помощью этого кода. Перед запуском этого:

  1. Убедитесь, что вы установили learnr с помощью install.packages("learnr") .

  2. Загрузите его с помощью library(learnr)

  3. Скопируйте этот код и сохраните его как файл Rmd. Или вы можете запустить новый документ через Файл -> Новый файл -> R Markdown -> Из шаблона -> Интерактивный учебник -> OK

     ---
    title: "Tutorial"
    output: learnr::tutorial
    runtime: shiny_prerendered
    ---
    
    ```{r setup, include=FALSE}
    library(learnr)
    knitr::opts_chunk$set(echo = FALSE)
    ``` #
    
      
     
        ```{r options, echo = FALSE} 
        question(
          "Input all possible rupture paths",
          answer("ABC"),
          answer("ABCD"),
          answer("ABEF, ABCDG, ABCDEF, ABDEF", correct = TRUE, message = "Correct Answer!"),
          type = "learnr_text", # radio
          try_again = "Wrong Answer, please try again",
          message = "Remember to enter answer in this format seperated by commas: ABC, ABCD",
          submit_button = "Submit",
          try_again_button = "Try Again",
          allow_retry = TRUE,
          options = list(
            placeholder = "Enter answer in this format seperated by commas: ABC, ABCD",
            trim = TRUE
          )
        )
    
    
      

введите описание изображения здесь

Чтобы узнать больше, это поможет вам начать:https://rstudio.github.io/learnr/#Getting_Started.

Вот несколько примеров кода отсюда:https://rstudio.github.io/learnr/questions.html

        
        ```{r letter-a, echo=FALSE}
        question("What number is the letter A in the English alphabet?",
          answer("8"),
          answer("14"),
          answer("1", correct = TRUE),
          answer("23")
        )
        ```

  

введите описание изображения здесь

Вы также можете разрешить студентам продолжать пробовать использовать allow_retry = TRUE

Обновить:

Вы можете добавить следующие строки в функцию вопроса.

 question(
      "Input all possible rupture paths",
      answer("ABC"),
      answer("ABCD"),
      answer("ABEF, ABCDG, ABCDEF, ABDEF", correct = TRUE),
      answer('ABCDEF, ABCDG, ABDEF, ABEF', correct = TRUE),
      answer('ABCDEF, ABCDG, ABEF, ABDEF', correct = TRUE),
      answer('ABCDEF, ABDEF, ABCDG, ABEF', correct = TRUE),
      answer('ABCDEF, ABDEF, ABEF, ABCDG', correct = TRUE),
      answer('ABCDEF, ABEF, ABCDG, ABDEF', correct = TRUE),
      answer('ABCDEF, ABEF, ABDEF, ABCDG', correct = TRUE),
      answer('ABCDG, ABCDEF, ABDEF, ABEF', correct = TRUE),
      answer('ABCDG, ABCDEF, ABEF, ABDEF', correct = TRUE),
      answer('ABCDG, ABDEF, ABCDEF, ABEF', correct = TRUE),
      answer('ABCDG, ABDEF, ABEF, ABCDEF', correct = TRUE),
      answer('ABCDG, ABEF, ABCDEF, ABDEF', correct = TRUE),
      answer('ABCDG, ABEF, ABDEF, ABCDEF', correct = TRUE),
      answer('ABDEF, ABCDEF, ABCDG, ABEF', correct = TRUE),
      answer('ABDEF, ABCDEF, ABEF, ABCDG', correct = TRUE),
      answer('ABDEF, ABCDG, ABCDEF, ABEF', correct = TRUE),
      answer('ABDEF, ABCDG, ABEF, ABCDEF', correct = TRUE),
      answer('ABDEF, ABEF, ABCDEF, ABCDG', correct = TRUE),
      answer('ABDEF, ABEF, ABCDG, ABCDEF', correct = TRUE),
      answer('ABEF, ABCDEF, ABCDG, ABDEF', correct = TRUE),
      answer('ABEF, ABCDEF, ABDEF, ABCDG', correct = TRUE),
      answer('ABEF, ABCDG, ABCDEF, ABDEF', correct = TRUE),
      answer('ABEF, ABCDG, ABDEF, ABCDEF', correct = TRUE),
      answer('ABEF, ABDEF, ABCDEF, ABCDG', correct = TRUE),
      answer('ABEF, ABDEF, ABCDG, ABCDEF', correct = TRUE),
      type = "learnr_text", # radio
      try_again = "Wrong Answer, please try again",
      message = "Remember to enter answer in this format seperated by commas: ABC, ABCD",
      submit_button = "Submit",
      try_again_button = "Try Again",
      allow_retry = TRUE,
      options = list(
        placeholder = "Enter answer in this format seperated by commas: ABC, ABCD",
        trim = TRUE
      )
    )
  

Чтобы сгенерировать это, я сделал следующее. Я уверен, что есть лучший способ сделать это, преобразовав это в функцию. Вот что я смог сделать на данный момент.

 a <- data.frame(gtools::permutations(4, 4, c("ABEF","ABCDG","ABCDEF","ABDEF")))
b <- paste(a$X1, a$X2, a$X3, a$X4, sep = ", ")
c <- paste("'", b, "'", sep = "")
d <- paste(c , "correct = TRUE)",sep = ", ")
e <- paste0( "answer(", d)
e
  

Выполнение этого даст это, которое вы затем можете вставить в функцию вопроса:

 [1] "answer('ABCDEF, ABCDG, ABDEF, ABEF', correct = TRUE)"
 [2] "answer('ABCDEF, ABCDG, ABEF, ABDEF', correct = TRUE)"
 [3] "answer('ABCDEF, ABDEF, ABCDG, ABEF', correct = TRUE)"
 [4] "answer('ABCDEF, ABDEF, ABEF, ABCDG', correct = TRUE)"
 [5] "answer('ABCDEF, ABEF, ABCDG, ABDEF', correct = TRUE)"
 [6] "answer('ABCDEF, ABEF, ABDEF, ABCDG', correct = TRUE)"
 [7] "answer('ABCDG, ABCDEF, ABDEF, ABEF', correct = TRUE)"
 [8] "answer('ABCDG, ABCDEF, ABEF, ABDEF', correct = TRUE)"
 [9] "answer('ABCDG, ABDEF, ABCDEF, ABEF', correct = TRUE)"
[10] "answer('ABCDG, ABDEF, ABEF, ABCDEF', correct = TRUE)"
[11] "answer('ABCDG, ABEF, ABCDEF, ABDEF', correct = TRUE)"
[12] "answer('ABCDG, ABEF, ABDEF, ABCDEF', correct = TRUE)"
[13] "answer('ABDEF, ABCDEF, ABCDG, ABEF', correct = TRUE)"
[14] "answer('ABDEF, ABCDEF, ABEF, ABCDG', correct = TRUE)"
[15] "answer('ABDEF, ABCDG, ABCDEF, ABEF', correct = TRUE)"
[16] "answer('ABDEF, ABCDG, ABEF, ABCDEF', correct = TRUE)"
[17] "answer('ABDEF, ABEF, ABCDEF, ABCDG', correct = TRUE)"
[18] "answer('ABDEF, ABEF, ABCDG, ABCDEF', correct = TRUE)"
[19] "answer('ABEF, ABCDEF, ABCDG, ABDEF', correct = TRUE)"
[20] "answer('ABEF, ABCDEF, ABDEF, ABCDG', correct = TRUE)"
[21] "answer('ABEF, ABCDG, ABCDEF, ABDEF', correct = TRUE)"
[22] "answer('ABEF, ABCDG, ABDEF, ABCDEF', correct = TRUE)"
[23] "answer('ABEF, ABDEF, ABCDEF, ABCDG', correct = TRUE)"
[24] "answer('ABEF, ABDEF, ABCDG, ABCDEF', correct = TRUE)"
  

Определенно есть лучший способ сделать это. Попробуйте опубликовать новый вопрос, и я уверен, что learnr сообщество поможет.

Комментарии:

1. Спасибо, это здорово, и я просматривал пакет learnr, и он идеально подходит для того, что я хочу. Я не могу найти простой способ заставить его принимать несколько разных ответов, определенных функцией. Например, здесь я бы хотел, чтобы он принимал все 24 перестановки разных порядков, в которые они могли бы ввести 4 ответа. Я хотел бы использовать что-то вроде: permutations(4, 4, c("ABEF","ABCDG","ABCDEF","ABDEF")) . Как я могу это сделать?

2. Из какого пакета permutations функция?

3. Я уверен, что есть более простой способ сделать это, чем предлагаемое мной сейчас решение. Пожалуйста, смотрите обновление

Ответ №2:

Вы не можете попробовать следующий фрагмент кода. Отредактируйте его в соответствии с вашими требованиями.

 library(shiny)
shinyApp(
  
  ui <- fluidPage(
    textInput('answer', label = 'Input all possible rupture paths', width = '30%'),
    actionButton("go", "Submit!"),
    uiOutput('feedback')
  ),
  
  server <- function(input,output,session){
    answers=reactiveVal(c("ABEF","ABCDG","ABCDEF","ABDEF"))
    
    observeEvent(input$go,{
      req(input$answer)
      if(input$answer %in% answers()){
        answers(setdiff(answers(),input$answer))
        output$feedback=renderText(paste("Correct answer.",length(answers()),"to go!"))
      }else{
        output$feedback=renderText(paste("Incorrect answer.",length(answers()),"to go!"))
      }
    })
  }
)

  

пример 1

введите описание изображения здесь