如何在学习者R教程中记录运动提交的内容?

时间:2018-08-10 02:54:18

标签: r

我写了一系列学习者教程来帮助学生学习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_id选项,程序是否就定义了tutorial_versionuser_idtutorial.event_recorder全局参数?然后,例如将事件定义为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()似乎对我不起作用。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我运行了代码,并观察了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标头中的默认值似乎没有任何效果。我仍在尝试深入了解。