#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.
Основываясь на вашем вопросе, я попытался воссоздать сценарий с помощью этого кода. Перед запуском этого:
-
Убедитесь, что вы установили
learnr
с помощьюinstall.packages("learnr")
. -
Загрузите его с помощью
library(learnr)
-
Скопируйте этот код и сохраните его как файл 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!"))
}
})
}
)