考试 num_to_schoice 包括错误的备选方案
exams num_to_schoice to include wrong alternatives
我正在使用 num_to_choice
为使用 r exams
包的数字练习生成 5 个选项。
我希望我的 sc$questions
包括正确的解决方案 (res
) 加上两个计算错误的解决方案 (err1
和 err2
)。我正在使用此代码:
sc <- num_to_schoice(res, digits=3, wrong=c(err1, err2))
我确实生成了五个选项,其中一个具有正确的解决方案 (res
),但其他四个选项中的 none 包括 err1
和 err2
。阅读 num_to_choice
文档我发现:
"The wrong solutions can be provided or are generated randomly. If
wrong is provided only up to 2 elements of it are used in order to
assure some random solutions."
但是,在我的例子中,err1
或 err2
选项的 none 包含在 sc$questions
中。我在这里错过了什么?如何强制 err
选项包含在 sc$questions
中?
这是一个可重现的例子:
v <- c(1225,4000,1372,974,956,940,1532,969,1070,685,220,407,903,239,283,368,483,352,77,699)
res <- sd(v)
err1 <- IQR(v)
err2 <- sqrt(var(v)*(length(v-1)/length(v)))
set.seed(1)
sc <- num_to_schoice(res, digits=3, wrong=c(err1, err2), range=c(0,max(v)))
这里是sc$questions
生成的解决方案:
结果是“指定的 'wrong' 对于 'delta' 来说太小了”
在你的例子中
在你的情况下 err2
和 res
是相同的:
identical(res, err2)
## [1] TRUE
这就是为什么 num_to_schoice()
returns NULL
以及一个警告,该警告应告知您 res
与 wrong
参数的区别太大对于给定的 delta
来说很小。因此,不可能将 res
作为正确的解决方案,将 err2
作为错误的解决方案。
问题的根源在于你计算
length(v - 1)
这与 length(v)
相同,而不是预期的
length(v) - 1
如果你这样做
err2 <- sqrt(var(v) * (length(v) - 1)/length(v))
然后你得到想要的
set.seed(1)
num_to_schoice(res, digits = 3, wrong = c(err1, err2))
## $solutions
## [1] FALSE FALSE FALSE TRUE FALSE
##
## $questions
## [1] "9.235$" "4.000$" "6.905$" "0.517$" "22.200$"
更普遍
根据设计 num_to_schoice()
相当保守:如果它认为无法找到一组具有所需属性的项目,它 returns NULL
而不是尝试找到近似解决方案。这是为了避免随机获得可能比预期更简单的练习。
另一个典型的例子是 range
太小 and/or 太大 delta
无法生成符合所有参数的五个答案选项列表。例如,假设我们有以下正确的解决方案和两个干扰因素:
res <- 1.234
err1 <- 2.345
err2 <- 3.456
那么,您在上面发布的命令将不起作用:
num_to_schoice(res, digits = 3, wrong = c(err1, err2))
## NULL
## Warning message:
## In num_to_schoice(res, digits = 3, wrong = c(err1, err2)) :
## specified 'range' is too small for 'delta'
原因是本例中默认的delta
为1,默认的range
为c(0.5, 1.5) * res
。这不够大,无法容纳 5 个至少 delta
为 1 的答案。
但是如果你增加 range
(或者减少 delta
)你会得到:
set.seed(1)
num_to_schoice(res, digits = 3, wrong = c(err1, err2), range = c(0, 10))
## $solutions
## [1] FALSE FALSE FALSE TRUE FALSE
##
## $questions
## [1] ".456$" ".345$" ".496$" ".234$" ".195$"
其中 res
在位置 4 结束,而 err1
和 err2
分别在位置 2 和 1。
我正在使用 num_to_choice
为使用 r exams
包的数字练习生成 5 个选项。
我希望我的 sc$questions
包括正确的解决方案 (res
) 加上两个计算错误的解决方案 (err1
和 err2
)。我正在使用此代码:
sc <- num_to_schoice(res, digits=3, wrong=c(err1, err2))
我确实生成了五个选项,其中一个具有正确的解决方案 (res
),但其他四个选项中的 none 包括 err1
和 err2
。阅读 num_to_choice
文档我发现:
"The wrong solutions can be provided or are generated randomly. If wrong is provided only up to 2 elements of it are used in order to assure some random solutions."
但是,在我的例子中,err1
或 err2
选项的 none 包含在 sc$questions
中。我在这里错过了什么?如何强制 err
选项包含在 sc$questions
中?
这是一个可重现的例子:
v <- c(1225,4000,1372,974,956,940,1532,969,1070,685,220,407,903,239,283,368,483,352,77,699)
res <- sd(v)
err1 <- IQR(v)
err2 <- sqrt(var(v)*(length(v-1)/length(v)))
set.seed(1)
sc <- num_to_schoice(res, digits=3, wrong=c(err1, err2), range=c(0,max(v)))
这里是sc$questions
生成的解决方案:
结果是“指定的 'wrong' 对于 'delta' 来说太小了”
在你的例子中
在你的情况下 err2
和 res
是相同的:
identical(res, err2)
## [1] TRUE
这就是为什么 num_to_schoice()
returns NULL
以及一个警告,该警告应告知您 res
与 wrong
参数的区别太大对于给定的 delta
来说很小。因此,不可能将 res
作为正确的解决方案,将 err2
作为错误的解决方案。
问题的根源在于你计算
length(v - 1)
这与 length(v)
相同,而不是预期的
length(v) - 1
如果你这样做
err2 <- sqrt(var(v) * (length(v) - 1)/length(v))
然后你得到想要的
set.seed(1)
num_to_schoice(res, digits = 3, wrong = c(err1, err2))
## $solutions
## [1] FALSE FALSE FALSE TRUE FALSE
##
## $questions
## [1] "9.235$" "4.000$" "6.905$" "0.517$" "22.200$"
更普遍
根据设计 num_to_schoice()
相当保守:如果它认为无法找到一组具有所需属性的项目,它 returns NULL
而不是尝试找到近似解决方案。这是为了避免随机获得可能比预期更简单的练习。
另一个典型的例子是 range
太小 and/or 太大 delta
无法生成符合所有参数的五个答案选项列表。例如,假设我们有以下正确的解决方案和两个干扰因素:
res <- 1.234
err1 <- 2.345
err2 <- 3.456
那么,您在上面发布的命令将不起作用:
num_to_schoice(res, digits = 3, wrong = c(err1, err2))
## NULL
## Warning message:
## In num_to_schoice(res, digits = 3, wrong = c(err1, err2)) :
## specified 'range' is too small for 'delta'
原因是本例中默认的delta
为1,默认的range
为c(0.5, 1.5) * res
。这不够大,无法容纳 5 个至少 delta
为 1 的答案。
但是如果你增加 range
(或者减少 delta
)你会得到:
set.seed(1)
num_to_schoice(res, digits = 3, wrong = c(err1, err2), range = c(0, 10))
## $solutions
## [1] FALSE FALSE FALSE TRUE FALSE
##
## $questions
## [1] ".456$" ".345$" ".496$" ".234$" ".195$"
其中 res
在位置 4 结束,而 err1
和 err2
分别在位置 2 和 1。