Как мне изменить десятичный разделитель в вопросе r-экзаменов на запятую?

#sweave #r-exams

#sweave #r-экзамены

Вопрос:

Я пытаюсь отобразить запятую в качестве десятичного разделителя в вопросах, которые я создаю с помощью «r-экзаменов / sweave». Однако я не могу загрузить пакет siunitx или выполнить любую другую конфигурацию, которая допускает это изменение. Я намерен экспортировать вопрос в moodle с помощью функции exams2moodle .

Ответ №1:

Через пакеты LaTeX

Пакеты LaTeX, подобные siunitx or icomma , могут использоваться только в том случае, если выходные данные создаются с помощью LaTeX (например, exams2pdf и т.д.). Однако, когда код LaTeX преобразуется в HTML (например, как в exams2moodle ), я не знаю общего решения преобразования чисел с десятичной запятой в десятичную запятую.

Через options(OutDec = ",") в R

Однако относительно просто установить options(OutDec = ",") внутри R. Это работает при условии, что:

  1. все соответствующие числа либо жестко закодированы в тексте с помощью запятой, либо создаются динамически с r ... помощью или Sexpr{...} , соответственно,
  2. гарантируется, что exsolution в num упражнениях по-прежнему используется десятичная точка.

В качестве примера рассмотрим schoice упражнение deriv2 . Он выполняет оба пункта выше: 1. все числа вставляются динамически из R, 2. это не num упражнение.

 library("exams")
options(OutDec = ",")
exams2html("deriv2.Rmd")
  

deriv2

То же самое работает и для Rnw-версии упражнения.

Если упражнение всегда должно выдавать числа с запятой, вы также можете включить options(OutDec = ",") в первый фрагмент кода в начале файла упражнения и вернуться к options(OutDec = ".") фрагменту кода в конце.

num Также возможно использование deriv упражнения. Но для обеспечения пункта 2. вам нужно будет либо написать fmt(res, decimal.mark = ".") вместо просто fmt(res) в exsolution , либо вернуться к options(OutDec = ".") , прежде чем добавлять метаинформацию.

Через fmt(..., decimal.mark = "{,}") в R

Одним из небольших недостатков описанного выше подхода является то, что зрители с вниманием к деталям могут заметить, что в режиме LaTeX math $...$ после запятой вставляется небольшой пробел. Пример см. На скриншоте выше.

Если вы хотите избежать этого, его {,} необходимо использовать в качестве десятичного разделителя. К сожалению, options(OutDec) не поддерживает это, поскольку это должна быть строка длиной 1. Кроме того, OutDec может быть недостаточно, потому что числа в математическом режиме нужны {,} , а числа в обычном тексте нужны просто , .

В этом случае самое простое решение — оставить options(OutDec) систему по умолчанию. Вместо этого используйте fmt(..., decimal.mark = "{,}") для чисел в математическом режиме и fmt(..., decimal.mark = ",") в обычном тексте. Чтобы уменьшить ввод текста, вы также можете добавить две удобные функции, скажем:

 cfmt <- function(x, ...) fmt(x, ..., decimal.mark = ",")
mfmt <- function(x, ...) fmt(x, ..., decimal.mark = "{,}")
  

Вместо того, чтобы опираться на exams::fmt() функцию, вы также можете использовать функцию base::format(..., decimal.mark = ...) в случае, если вы хотите обработать любое округление самостоятельно.

Требования

Обратите внимание, что для перехода decimal.mark к fmt() требуется как минимум версия 2.4-0 R / exams.

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

1. Прошу прощения, вам необходимо использовать текущую версию пакета для разработки (скоро будет выпущена для CRAN). Я забыл, что добавил эту функцию после последнего выпуска. Просто запустите: install.packages("exams", repos="http://R-Forge.R-project.org")

2. Re: ничего не изменилось. Правильно ли вы повторно загрузили пакет после переустановки пакета? Я бы рекомендовал попробовать в новом сеансе и убедиться, что packageVersion("exams") это 2.4-0. Re: запятая. В Moodle невозможно загрузить дополнительные пакеты LaTeX, см. tex.stackexchange.com/questions/545491 /. … И в R это, к сожалению, невозможно установить OutDec = "{,}" . Итак, в качестве альтернативы оставьте OutDec без изменений (т. Е. "." ) И вместо этого используйте fmt(..., decimal.mark = "{,}") .

3. В качестве личного комментария: я ценю внимание к деталям, и эти детали являются причиной, по которой мне лично нравится использовать LaTeX, но я сомневаюсь, что многие из ваших студентов заботятся об этом на экзамене. Вот почему я не утруждаю себя такой тонкой настройкой. Хотя на немецком языке вы также использовали бы десятичную запятую, я использую десятичную точку во всех своих книгах, слайдах, упражнениях и т. Д. До тех пор, пока учащиеся правильно принимают запятую и точку в решениях, которые вводят учащиеся (как в случае с Moodle) У меня никогда не было никаких проблем с этим. (Конечно, это нормально, если ваши приоритеты разные!)

4. Я добавил decimal.mark = "{,}" решение с некоторыми дополнительными пояснениями к ответу. Я надеюсь, что теперь это охватывает все соответствующие аспекты.

5. Я отредактировал свой ответ, чтобы упростить внесение изменений. Re: заставить пакет делать это автоматически. Я не вижу достаточно простого и надежного способа сделать это. Заменить все «.» на «,» или «{,}» сложно, потому что необходимо определить математический режим и, что более важно, «.» может использоваться как разделитель тысяч, который еще сложнее автоматически определить. Следовательно, авторы упражнений действительно должны позаботиться об этом. Мой ответ должен содержать достаточно подробностей, чтобы они могли сделать осознанный выбор, что лучше всего подходит для них. Если вы чувствуете, что это все еще «неприемлемо», это, конечно, зависит от вас.