Рандомизация структуры вопросов на r-экзаменах

#r #r-exams

Вопрос:

Я пытаюсь создать тест на холсте, в котором студентам предлагается оценить эффективное сопротивление различных цепей. Схемы содержат от 2 до 4 резисторов со значениями, выбранными из серии E12. Чтобы ответить на этот вопрос, студенты демонстрируют, что они понимают параллельные и последовательные соединения между резисторами.

Для любой конфигурации одной схемы я могу создать вопрос (вот пример для двух последовательных резисторов).

     begin{question}

What is the total resistance between points a and b if $R_1 = Sexpr{r1}$ Sexpr{char1_insert}$Omega$ and $R_2 = Sexpr{r2}$ Sexpr{char2_insert}$Omega$?
setkeys{Gin}{width=0.3textwidth}
<<fig=TRUE, height = 4, width = 4, echo=FALSE, eps=FALSE, results=hide>>=
plot.new()
rasterImage(im, 0, 0, 1, xmax)
@
 end{question}

begin{solution}
Resistors in series should be added. So 
begin{eqnarray*}
R_{tot} amp; = amp; R_1   R_2\
R_{tot} amp; = amp; Sexpr{r1_val}   Sexpr{r2_val}\
R_{tot} amp; = amp; Sexpr{res}~Omega
end{eqnarray*}
end{solution}
 

но я не могу понять, как рандомизировать выбор типа вопроса. Например, если сценарий случайным образом выбирает между двумя последовательно включенными резисторами или тремя последовательно включенными резисторами, то следующее не работает

     begin{question}
What is the total resistance between points a and b given the following:
<<>>=
if (sel==1)
{
@
$R_1 = Sexpr{r1}$ Sexpr{char1_insert}$Omega$, and $R_2 = Sexpr{r2}$ Sexpr{char2_insert}$Omega$, arranged as shown in the schematic
<<>>=
} else if (sel == 2)
{
@
$R_1 = Sexpr{r1}$ Sexpr{char1_insert}$Omega$, $R_2 = Sexpr{r2}$ Sexpr{char2_insert}$Omega$, and $R_3 = Sexpr{r3}$ Sexpr{char3_insert}$Omega$ arranged as shown in the schematic
<<fig=TRUE, height = 4, width = 4, echo=FALSE, eps=FALSE, results=hide>>=
plot.new()
rasterImage(im, 0, 0, 1, xmax)
@
end{question}
#similar code for solution
 

Что я отчасти понимаю, потому что операторы if прерываются, и переводчик задыхается от этого (я думаю). Но есть ли способ сделать это?

Ответ №1:

Да, вы правы, что упражнение таким образом синтаксически неверно и, следовательно, не может быть обработано правильно.

Что вам нужно сделать, так это вставить ваши переменные R ( r1 char1_insert1 , и т.д.) В строку вопроса в R (например, с помощью paste() или sprintf() ), а затем вставить всю строку в {question} использование Sexpr{} .

Я проиллюстрирую это ниже, используя sprintf() , где %s находится заполнитель для строк, которые должны быть вставлены. Это заменяет Sexpr{} вставки из вашей оригинальной версии.

 qu <- if(sel == 1) {
  sprintf("$R_1 = %s$ %s$Omega$, and $R_2 = %s$ %s$Omega$",
    r1, char1_insert, r2, char2_insert)
} else {
  sprintf("$R_1 = %s$ %s$Omega$, $R_2 = %s$ %s$Omega$, and $R_3 = %s$ %s$Omega$",
    r1, char1_insert, r2, char2_insert, r3, char3_insert)
}
 

В результате получается символьная строка qu , содержащая текст вопроса. Затем это может быть включено в {question} via:

 What is the total resistance between points a and b if Sexpr{qu},
arranged as shown in the schematic
 

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

1. Ах, да. Я пробовал несколько версий построения строк, но не sprintf(). Я попробовал вставить(). Когда результат был передан на консоль, форматирование оказалось правильным. Но когда я вызвал exams2[выбор формата] в файле, полученная строка вообще не была обработана.

2. ОК. Итак, вы решили проблему сейчас? Если это так, пожалуйста, примите ответ, нажав на галочку слева. Если что-то все еще неясно, пожалуйста, возобновите вопрос.

3. Хм, я мог бы поклясться, что поставил галочку.