3.3 Única escolha com dados gerados

Nas questões com dados gerados, utilizaremos alguma função de amostragem ou aleatorização para geração de dados (pseudo)aleatórios. São estas funções que demonstram todo o potencial de criação do banco de questões dinamicamente.

Uma das opções é criar uma alternativa de única escolha a partir do processo de geração de dados. Abaixo, uma figura exemplificando 4 versões aleatórias do mesmo exercício:

Questões do tipo única escolha (*schoice*) criadas a partir de dados aleatórios. Estão apresentadas 4 versões do mesmo exercício.

Figura 3.3: Questões do tipo única escolha (schoice) criadas a partir de dados aleatórios. Estão apresentadas 4 versões do mesmo exercício.

Fonte da figura: O autor

E o código em RMarkdown:

```{r dgp, include = FALSE} 
library(exams)
library(magrittr)
library(knitr)
options(scipen = 999) #prevent scientific notation 

## RANDOM DATA 
Mu <- 100:999 %>% sample(6)

## SOLUTION
Mean <- mean(Mu) %>% round(2) #correct
Sch <- num2schoice(correct = Mean) #to schoice
```
Question
========
Considere a sequência de números abaixo:  
 `r Mu` 
Qual é a média desses valores?  

```{r questionlist, echo = FALSE, results = "asis"}
 answerlist(Sch$questions, markup = "markdown")
```

Solution
========
A média é igual a  `r Mean` 

Meta-information
================
exname: media
extype: schoice
exsolution:  `r mchoice2string(Sch$solutions)` 

download exemplo schoice-dgp.Rmd

Observem que a marcação é essencialmente igual aos itens já vistos anteriormente. Por isso, vamos focar a explicação no código de geração dos números aleatórios.

O arquivo inicia com um trecho de código em R: ```{r dgp, include=FALSE} A opção include=FALSE indica que o código em si não será incluído no texto final, mas os objetos gerados podem ser utilizados em operações posteriores. Em seguida, a função library carrega alguns pacotes que contem funções úteis. A opção options(scipen = 999) previne que os números sejam mostrados em notação científica, o que pode causar alguns erros bizarros. Até aqui, este trecho inicial pode ser mantido como padrão em todos os exercícios, sem necessidade de mudanças.

Em ## RANDOM DATA, criamos os objetos aleatórios. A linha Mu <- 100:999 %>% sample(6) cria um objeto chamado Mu que contém 6 valores escolhidos aleatoriamente (sample(6)) entre 100 e 999 (100:999). Cada vez que esta linha é executada, ou cada vez que um exercício é criado, os 6 valores escolhidos irão diferir da escolha anterior. Este é o ponto principal da aleatorização.

Em ## SOLUTION, executamos alguns cálculos para obter a resposta correta. Mean <- mean(Mu) %>% round(2) cria um objeto chamado Mean que armazena média calculada dos 6 valores escolhidos anteriormente (mean(Mu)) arredondada para a segunda casa decimal (round(2)).

A próxima linha, Sch <- num2schoice(correct = Mean), utiliza a função de conveniência num2schoice para criar 5 alternativas, sendo uma correta (correct=Mean) e mais quatro incorretas aleatórias. Obviamente, outros métodos podem ser utilizados para criar as alternativas incorretas.

Após a marcação Question, vejam a linha que contém o código `r Mu`. Estre trecho “imprime” os valores amazenados no objeto Mu (são 6 valores escolhidos aleatoriamente).

Em seguida, o trecho de código:

```{r questionlist, echo = FALSE, results = "asis"}
 answerlist(Sch$questions, markup = "markdown")  
```

utiliza a função de conveniência answerlist para “impimir” as 5 alternativas criadas anteriormente e armazenadas no objeto Sch.

Na marcação Solution, usamos novamente `r Mean` para “imprimir” o valor da média correta calculada.

Por fim, em exsolution, temos a função de conveniência mchoice2string para criar a resposta no formato adequado para este campo (binário).