如何删除重复项目的问题?

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 练习中。