【问题标题】:How can I record exercise submission in a learnr R tutorial?如何在学习者 R 教程中记录练习提交?
【发布时间】:2019-01-17 13:59:04
【问题描述】:

我写了一系列学习者教程来帮助学生学习R,我需要记录学生何时提交了一个问题或一个练习的答案。 learnr 文档的一部分涉及该主题 (https://rstudio.github.io/learnr/publishing.html#recording_events),但显然没有达到我需要的详细程度。我有两个主要问题领域,在这些问题下方我粘贴了示例教程的代码。

  1. 设置tutorial.event_recorder 选项:learnr 文档说明

    “您可以使用自定义事件记录器功能捕获事件。此功能通过tutorial.event_recorder 全局选项指定。”

    我在网上找到了一个例子,它在设置块中定义为

    options(tutorial.event_recorder = learnr:::debug_event_recorder)
    

    这就是我在代码中添加的内容,但还有其他可能的选择吗?我是否正确使用它?

  2. 实际记录事件:learnr 文档创建了一个示例事件记录器函数,打印到标准输出为

    tutorial_event_recorder <- function(tutorial_id, tutorial_version,
                                        user_id, event, data) {
    cat(tutorial_id, " (", tutorial_version, "): ", user_id , "\n", sep = "")
    cat("event: ", event, "\n", sep = "")
    }
    

假设我对这种级别的事件记录感到满意:我假设我在某个 R 代码块中定义它,但我在哪里调用它?一旦我设置了tutorial.event_recorder 选项,tutorial_idtutorial_versionuser_id 是由程序定义的全局参数吗?那么我是否将事件定义为exercise_submission,例如?是否有参数指定提交了哪个练习或问题?每个教程我通常有几个练习和问题。

如果有帮助,我已经粘贴了我的教程代码示例。最终我想合并checkr 包和它的事件记录,但我现在没有时间做好。这些教程托管在服务器上,但我首先尝试让事件记录在本地工作。非常感谢!

---
title: "Tutorial:  Categorical Variables"
output: learnr::tutorial
runtime: shiny_prerendered
tutorial:
  id: "toytorial"
---


```{r setup, include=FALSE}
library(learnr)
knitr::opts_chunk$set(echo = TRUE)
tutorial_options(exercise.eval = FALSE)
options(tutorial.event_recorder = learnr:::debug_event_recorder)
```

### Test yourself

Use the `dim()` command to get the number of columns and rows in the data frame 'iris'.
```{r, ex1, exercise=TRUE, echo = FALSE}

```

```{r, q1, echo=FALSE}
question("How many rows are in the 'iris' data frame?",
  answer("5"),
  answer("150", correct=TRUE)
)
```

编辑:在 Andrie 于 8 月 24 日的回答和 Andrie 在 github.com/rstudio/learnr/issues/182 上发布的有用示例教程之后,我已将示例教程中的设置块更新为:

```{r setup, include=FALSE}
library(learnr)
knitr::opts_chunk$set(echo = TRUE)

tutorial_options(exercise.eval = FALSE)
new_recorder <- function(tutorial_id, tutorial_version, user_id, event, data) {
    cat(tutorial_id, " (", tutorial_version, "): ", user_id, ", ", event, ", ", data$label, ", ", data$answers, ", ", data$correct, "\n", sep = "")
}

options(tutorial.event_recorder = new_recorder)

```

现在我知道要查看 RStudio 中的 R Markdown 窗口,我会在回答问题或尝试练习时看到记录。我仍然不知道如何将事件记录写入文件或数据库:sink() 似乎不适合我。

【问题讨论】:

  • 您知道如何将事件记录写入文件或数据库吗?
  • 不幸的是,我没有,但自从我发布此消息以来,我一直无法深入研究它。我希望可能有一些更新的工具会有所帮助。提交者包,也许? link

标签: r


【解决方案1】:

我运行了您的代码,并观察到来自 stdout 的以下输出(如果您使用的是 RStudio,则在 RMarkdown 窗格中)。

这个输出回答了你的第一个问题,关于如何定义event。从输出中可以清楚地看出learnr 记录功能会自动记录事件。在这种情况下,事件分别为exercise_submissionquestion_submission

C:/Users/apdev/Documents/temp (1.0): apdev
event: exercise_submission
List of 6
 $ label        : chr "ex1"
 $ code         : chr "\ndim(iris)\n"
 $ output       : 'html' chr "\n\n\n<pre><code>[1] 150   5</code></pre>\n"
  ..- attr(*, "html")= logi TRUE
  ..- attr(*, "html_dependencies")= list()
 $ error_message: NULL
 $ checked      : logi FALSE
 $ feedback     : NULL

C:/Users/apdev/Documents/temp (1.0): apdev
event: question_submission
List of 4
 $ label   : chr "q1"
 $ question: chr "How many rows are in the &#39;iris&#39; data frame?"
 $ answers : chr "5"
 $ correct : logi FALSE

您的其他问题已在标题 Tutorial identifiers 下的文档中得到解答。简而言之,learnr 将使用以下默认标识符:

  • tutorial_id:教程的网络来源和路径。
  • tutorial_version:1.0
  • user_id : 执行教程的服务器用户账号名

我已经尝试过了,它可以与 RStudio Connect 一起使用。


但是,我怀疑learnr 包中可能存在错误,因为更改 YAML 标头中的默认值似乎没有任何效果。我仍在努力追根究底。

【讨论】:

【解决方案2】:

关于将事件记录写入文件,执行此操作的基本方法是将 file = "/my_path/my_filename.txt"append = TRUE 作为附加参数传递给 new_recorder 函数中的 cat 函数。

【讨论】:

  • 这很好用,但是有什么方法可以记录数字输入而不是 TRUE 和 FALE 以获得正确和错误的答案?
猜你喜欢
  • 2010-09-15
  • 2012-08-20
  • 2015-05-01
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 2016-01-27
  • 2013-01-08
  • 1970-01-01
相关资源
最近更新 更多