制作参数化问题的确定性版本

Making deterministic versions of a parametrized question

假设一个问题在参数 ab 上被参数化。并假设 a 可以取值 1、2 和 3,并且 b 可以取值 1 和 2。是否可以为 [= 的可能值的每个组合获取一个版本11=] 和 b?即:

a = 1, b = 1;

a = 2, b = 1;

a = 3, b = 1;

a = 1, b = 2;

...

我的意思是 ab 的所有值都必须确定性地生成,而不是随机生成。

TL;DR 您可以使用 expar("myfile.Rmd", a = 1, b = 1) 等轻松生成六个固定版本。下面提供了 ?expar 的更多详细信息。

注:然而,该函数的主要动机不是生成练习的所有个版本(尽管它可以用于为此),但要在练习中固定一些参数,例如,以确保参与者之间的随机变化不会变得太大。至少那是我用它的目的。我不介意完全生成所有版本

详情: expar() 函数复制一个练习文件(在临时目录中)并替换第一个代码块中指定参数的第一个赋值。它 returns 带有修改练习的临时文件的路径。然后可以“像往常一样”用 'exams2xyz' 处理。来自 ?expar:

To work properly, the parameter of interest must be defined with a standard assignment in the first code chunk at the beginning of a line. The original definition of the parameter must be in a single line only (typically using something like sample or runif etc.).

示例: 基于 deriv 练习。

myderiv <- expar("deriv.Rmd", a = 1, b = 2)
myderiv
## [1] "/tmp/RtmpEnHBap/deriv+606EE82A+D5F7B.Rmd"
exams2html(myderiv)

迭代次数: 如果您想遍历练习中几个参数的所有可能组合,可以使用 expand.grid()sapply()。一个小的方便函数可以是:

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)
  })
}

然后你可以迭代,例如:

myderivs <- expargrid("deriv.Rmd", a = 1:3, b = 1:2)
myderivs
## [1] "/tmp/RtmpfB5SQB/deriv+606F0DA0+8A2C4.Rmd"
## [2] "/tmp/RtmpfB5SQB/deriv+606F0DA0+8A838.Rmd"
## [3] "/tmp/RtmpfB5SQB/deriv+606F0DA0+8AD47.Rmd"
## [4] "/tmp/RtmpfB5SQB/deriv+606F0DA0+8B238.Rmd"
## [5] "/tmp/RtmpfB5SQB/deriv+606F0DA0+8B71D.Rmd"
## [6] "/tmp/RtmpfB5SQB/deriv+606F0DA0+8BC06.Rmd"
exams2html(myderivs)