1

当我加载 dplyr 库时,我注意到 R 考试包中的奇怪行为。下面的示例仅在我明确调用 dplyr 命名空间时才有效,如注释中所示。请注意,该错误仅发生在新会话中,即您需要重新启动 R 才能看到我看到的内容。您需要将以下内容放在文件exam.Rmd中,然后调用

library(exams)
library(dplyr)
exams2html("exam.Rmd")  # in pwd

# this is exam.Rmd
```{r datagen,echo=FALSE,results='hide',warning=FALSE,message=FALSE}
df = data.frame(i = 1:4, y = 1:4, group = paste0("g",rep(1:2,2)))
# works:
b2 = diff(dplyr::filter(df,group!="g1")$y)
b3 = diff(dplyr::filter(df,group!="g2")$y)
# messes up the complete exercise:
# b2 = diff(filter(df,group!="g1")$y)
# b3 = diff(filter(df,group!="g2")$y)
nq = 2
questions <- solutions <- explanations <- rep(list(""), nq)
type <- rep(list("num"),nq)

questions[[1]] = "What is the value of $b_2$ rounded to 3 digits?"
questions[[2]] = "What is the value of $b_3$ rounded to 3 digits?"
solutions[[1]] = b2
solutions[[2]] = b3
explanations[[1]] = paste("You have you substract the conditional mean of group 2 from the reference group 1. gives:",b2)
explanations[[2]] = paste("You have you substract the conditional mean of group 3 from the reference group 1",b3)
```


Question
========
You are given the following dataset on two variables `y` and `group`. 

```{r showdata,echo=FALSE}
# kable(df,row.names = FALSE,align = "c")
df
```

some text with math

$y_i = b_0 + b_2 g_{2,i}  + b_3 g_{3,i} + e_i$

```{r questionlist, echo = FALSE, results = "asis"}
answerlist(unlist(questions), markup = "markdown")
```

Solution
========

```{r sollist, echo = FALSE, results = "asis"}
answerlist(unlist(explanations), markup = "markdown")
```

Meta-information
================
extype: cloze
exsolution: `r paste(solutions,collapse = "|")`
exclozetype: `r paste(type, collapse = "|")`
exname: Dummy Manual computation
extol: 0.001
4

2 回答 2

5

感谢您提出这个问题并感谢@hrbrmstr 解释问题的一部分。但是,仍然缺少部分解释:

  • 当然,问题的根源在于两者statsdplyr导出的filter()功能不同。并且它可以取决于首先找到哪个功能的各种因素。
  • 在交互式会话中,以正确的顺序加载包并随后stats自动加载就足够了。dplyr因此这有效:
    library("knitr")
    library("dplyr")
    knit("exam.Rmd")
  • 我花了一点时间才弄清楚你这样做有什么不同:
    library("exams")
    library("dplyr")
    exams2html("exam.Rmd")
  • 事实证明,在后一个代码块knit()中被调用exams2html(),因此包NAMESPACEexams改变了搜索路径,因为它完全导入了整个stats包。因此,除非在加载的环境stats::filter()(例如. (有关更多详细信息,请参阅@hrbrmstr 的答案)dplyr::filter()dplyr.GlobalEnv

由于包没有迫切的理由exams导入整个stats包,我已将其更改NAMESPACE为仅选择性地导入所需的功能(不包括该filter()功能)。请从 R-Forge 安装开发版本:

install.packages("exams", repos = "http://R-Forge.R-project.org")

然后您的 .Rmd 可以编译,而无需在 .Rmd 中或在调用之前dplyr::...包含- 。两者现在都应该按预期工作。library("dplyr")exams2html()

于 2018-11-22T20:19:50.490 回答
1

使用您的exams.Rmd,这是我即将点击 cmd-enter 的源窗格:

在此处输入图像描述

(我添加了quiet=FALSE这样我可以看到发生了什么)。

这是 cmd-enter 后的控制台输出:

在此处输入图像描述

这是输出:

在此处输入图像描述

如果您一直阅读到帮助knit

  • envir要在其中评估代码块的环境,例如parent.frame()new.env()globalenv())

所以parent.frame()orglobalenv()是必需的,而不是你所做的(你似乎并不完全了解环境)。你TRUE从你的exists()调用中得到,因为默认情况下 inheritsTRUEexists函数中,它告诉函数“[搜索]环境的封闭框架”(来自exists.

而且,您应该非常关心源代码和分类错误。你正在使用一种编程语言和开源软件,你是对的,由于这个“伟大”library(dplyr)包中的一些糟糕的代码选择,你没有在 Rmd 中工作,你不想指出,因为你没有想看源码。

结束,因为我不能为你做更多。我只是希望其他人从中受益。

于 2018-11-22T11:58:34.557 回答