我们目前使用 R/exams 在我们的编码课程中创建考试。我们发现学生可以轻松地复制和粘贴代码块并不假思索地运行它。例子:
因此,我们想知道 R/exam 或其他包中是否存在可以防止这种情况的参数/选项,例如,将代码块转换为图像。然后,学生就无法复制和粘贴我们的代码。
让我在这里稍微玩一下LockPickingLawyer 。即使您设法以图像形式提供代码,我们也能够轻松进行 OCR 并运行它,并且该解决方案将使那些知道如何执行此操作的人受益。
text <- tesseract::ocr("https://i.stack.imgur.com/wSRv5.png") ## imgur url from OP
cat(text)
## copy-paste and run
x = -2
if(x > 0){
x<- x +1
} else if(x == 0){
x<-x-1
} else {
x <- x * (-1)
}
x
# [1] 2
Run Code Online (Sandbox Code Playgroud)
那么为什么不问为什么结果是2这样,或者“用文字描述每一行代码的作用”呢?
没有现成的选项来生成图像,但可以使用构建块自己编写一些代码。特别是,R/exams 包提供了一个tex2image()函数,可以获取 LaTeX 代码块并将其转换为图像,然后您可以将其嵌入到问题中。
下面我提供了一个有效的示例,它也随机地将一些元素插入到代码中:
```{r, include=FALSE}
## code as character string
code <- "
x <- %s
if (x > %s) {
x <- x + 1
} else if (x == %s) {
x <- x - 1
} else {
x <- x * (-1)
}
x
"
## random inputs
x <- sample(-9:9, 1)
y <- sample(-3:3, 1)
code <- sprintf(code, x, y, y)
## screenshot
img <- tex2image(c("\\begin{verbatim}", code, "\\end{verbatim}"),
name = "code", dir = ".", resize = 220)
## solution
sol <- eval(parse(text = code))
```
Question
========
The following code results in which output?
\

Meta-information
================
exname: Conditional execution (with screenshot)
extype: num
exsolution: `r sol`
Run Code Online (Sandbox Code Playgroud)
这个想法是首先将代码(或代码模板)设置为字符串,然后插入一些随机元素,生成图像,评估代码输出,然后以通常的 R/exams 方式进行准备。您可能需要使用resize参数来以合适的方式控制图像的大小。
就我个人而言,我不喜欢这样的解决方法,因为它们感觉引入了额外的障碍,而这些障碍实际上与学习 R 无关。使用这些策略也可能会激励学生找到使用 OCR 等解决方法(请参阅其他答案)。
相反,我通常尝试根据定性陈述将答案格式更改为单选或多选。例如,对于您原始帖子中的代码:
等等...