如何删除重复项目的问题?
How to remove questions with repeated items?
经常,在根据参数生成问题时,必须剔除一些生成的问题,因为在这样的问题中,有时会发生某些项目相同的情况。
我的代码如下。
问题:
```{r, include = FALSE}
a <- sample(1:1,1)
b <- sample(1:1,1)
```
Question
========
Let $z = `r (a^2)*(b^2)`$. Hence, $\sqrt{z}$ is equal to:
Answerlist
----------
* $`r a*b`$
* $`r -a*b`$
* $`r 2*a*b`$
* $`r 3*a*b`$
* $`r 4*a*b`$
Meta-information
================
exname: My question
extype: schoice
exsolution: 10000
exshuffle: TRUE
生成多个版本问题的代码:
library(exams)
setwd("/tmp/")
expargrid <- function(file, ...) {
df <- expand.grid(...)
stopifnot(nrow(df) >= 1L)
sapply(1L:nrow(df), function(i) {
args <- as.list(df[i,])
args <- c(list(file = file), args)
do.call(exams::expar, args)
})
}
n <- 1
myquestions <- expargrid(paste0("question",sprintf("%02d", n),".Rmd"), a = 0:1, b = 0:1)
exams2moodle(myquestions,dir = "/tmp/", schoice=list(answernumbering="none"), name="PM")
R/Exams生成的Moodlexml
文件中的坏题能否自动剔除?
通常很难在 Rmd 练习文件之外发现此类问题。相反,最好在练习中编写 R 代码,以确保问题列表仅包含唯一项目 - 如果不是这种情况,请继续对参数重新采样,直到有一个版本有效。
捕获问题的部分原因还在于它可能取决于随机数生成器及其种子,因为该问题可能很少发生。
在你的特殊情况下,这有点不同,因为你制作了所有可能组合的完整网格,这样每个练习文件就不再有任何随机元素。这里最好的解决方案是 运行 一个 exams2xyz()
接口(或底层 xexams()
函数)一次,检查输出,消除有问题的练习,然后 运行 所需的 exams2xyz()
再次界面
依靠你的 myquestions
向量和动态 question01.Rmd
练习模板的四个静态变体你可以做:
myq_check <- xexams(myquestions)
## Warning messages:
## 1: In driver$read(file_tex[idj]) :
## duplicated items in question list in '_tmp_Rtmpjhh2Lb_question01+60A32D0E+C9FE1'
## 2: In driver$read(file_tex[idj]) :
## duplicated items in question list in '_tmp_Rtmpjhh2Lb_question01+60A32D0E+CA2C6'
## 3: In driver$read(file_tex[idj]) :
## duplicated items in question list in '_tmp_Rtmpjhh2Lb_question01+60A32D0E+CA4CF'
这类似于 运行ning exams2moodle(myquestions)
,但仅编织 Rmd 文件并将它们读入 R - 无需将它们转换为 HTML 并编写 Moodle XML文件。因此它会更快一些,并且不会产生任何之后需要清理的文件。
输出 myq_check
是一个嵌套列表
- 1 个列表用于
n = 1
随机复制,
- 每个包含与来自
myquestions
、 的四个练习文件相关的 4 个列表
- 每个包含 6 个列表元素
question
文字,
questionlist
含问题项,
solution
文本(如果有的话,在本例中为空),
solutionlist
附解法说明(如有,此处为空),
metainfo
加上元信息,
supplements
补充文件的文件路径(如果有,此处为空)。
运行 xexams(myquestions)
已经警告了三个(四个中的)练习文件中的问题。 (您需要使用 R/exams 版本 >= 2.4-0 来获取这些。)通过检查 questionlist
中唯一项目的数量,我们可以找出哪些受此影响:
ok <- sapply(myq_check[[1]], function(x) {
length(x$questionlist) == length(unique(x$questionlist)) })
## exercise1 exercise2 exercise3 exercise4
## FALSE FALSE FALSE TRUE
因此,只有 myquestions
中的最后一个练习是真正合适的,所以你应该在继续 exams2moodle()
之前进行子集化:
myquestions <- myquestions[ok]
exams2moodle(myquestions)
正如上面已经指出的那样。在这种情况下,这足以进行选择。如果练习文件中仍然存在随机性,这可能不足以解决所有问题。那么最好将自定义解决方案编写到 Rmd 练习中。
经常,在根据参数生成问题时,必须剔除一些生成的问题,因为在这样的问题中,有时会发生某些项目相同的情况。
我的代码如下。
问题:
```{r, include = FALSE}
a <- sample(1:1,1)
b <- sample(1:1,1)
```
Question
========
Let $z = `r (a^2)*(b^2)`$. Hence, $\sqrt{z}$ is equal to:
Answerlist
----------
* $`r a*b`$
* $`r -a*b`$
* $`r 2*a*b`$
* $`r 3*a*b`$
* $`r 4*a*b`$
Meta-information
================
exname: My question
extype: schoice
exsolution: 10000
exshuffle: TRUE
生成多个版本问题的代码:
library(exams)
setwd("/tmp/")
expargrid <- function(file, ...) {
df <- expand.grid(...)
stopifnot(nrow(df) >= 1L)
sapply(1L:nrow(df), function(i) {
args <- as.list(df[i,])
args <- c(list(file = file), args)
do.call(exams::expar, args)
})
}
n <- 1
myquestions <- expargrid(paste0("question",sprintf("%02d", n),".Rmd"), a = 0:1, b = 0:1)
exams2moodle(myquestions,dir = "/tmp/", schoice=list(answernumbering="none"), name="PM")
R/Exams生成的Moodlexml
文件中的坏题能否自动剔除?
通常很难在 Rmd 练习文件之外发现此类问题。相反,最好在练习中编写 R 代码,以确保问题列表仅包含唯一项目 - 如果不是这种情况,请继续对参数重新采样,直到有一个版本有效。
捕获问题的部分原因还在于它可能取决于随机数生成器及其种子,因为该问题可能很少发生。
在你的特殊情况下,这有点不同,因为你制作了所有可能组合的完整网格,这样每个练习文件就不再有任何随机元素。这里最好的解决方案是 运行 一个 exams2xyz()
接口(或底层 xexams()
函数)一次,检查输出,消除有问题的练习,然后 运行 所需的 exams2xyz()
再次界面
依靠你的 myquestions
向量和动态 question01.Rmd
练习模板的四个静态变体你可以做:
myq_check <- xexams(myquestions)
## Warning messages:
## 1: In driver$read(file_tex[idj]) :
## duplicated items in question list in '_tmp_Rtmpjhh2Lb_question01+60A32D0E+C9FE1'
## 2: In driver$read(file_tex[idj]) :
## duplicated items in question list in '_tmp_Rtmpjhh2Lb_question01+60A32D0E+CA2C6'
## 3: In driver$read(file_tex[idj]) :
## duplicated items in question list in '_tmp_Rtmpjhh2Lb_question01+60A32D0E+CA4CF'
这类似于 运行ning exams2moodle(myquestions)
,但仅编织 Rmd 文件并将它们读入 R - 无需将它们转换为 HTML 并编写 Moodle XML文件。因此它会更快一些,并且不会产生任何之后需要清理的文件。
输出 myq_check
是一个嵌套列表
- 1 个列表用于
n = 1
随机复制, - 每个包含与来自
myquestions
、 的四个练习文件相关的 4 个列表
- 每个包含 6 个列表元素
question
文字,questionlist
含问题项,solution
文本(如果有的话,在本例中为空),solutionlist
附解法说明(如有,此处为空),metainfo
加上元信息,supplements
补充文件的文件路径(如果有,此处为空)。
运行 xexams(myquestions)
已经警告了三个(四个中的)练习文件中的问题。 (您需要使用 R/exams 版本 >= 2.4-0 来获取这些。)通过检查 questionlist
中唯一项目的数量,我们可以找出哪些受此影响:
ok <- sapply(myq_check[[1]], function(x) {
length(x$questionlist) == length(unique(x$questionlist)) })
## exercise1 exercise2 exercise3 exercise4
## FALSE FALSE FALSE TRUE
因此,只有 myquestions
中的最后一个练习是真正合适的,所以你应该在继续 exams2moodle()
之前进行子集化:
myquestions <- myquestions[ok]
exams2moodle(myquestions)
正如上面已经指出的那样。在这种情况下,这足以进行选择。如果练习文件中仍然存在随机性,这可能不足以解决所有问题。那么最好将自定义解决方案编写到 Rmd 练习中。