R экзаменационный пакет странное поведение с dplyr - PullRequest
0 голосов
/ 21 ноября 2018

Я заметил странное поведение в пакете экзаменов R при загрузке библиотеки dplyr.Приведенный ниже пример работает, только если я явно вызываю пространство имен 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

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Спасибо за то, что подняли эту проблему и @hrbrmstr за объяснение одной части проблемы.Однако одна часть объяснения по-прежнему отсутствует:

  • Конечно, корень проблемы в том, что и stats, и dplyr экспортируют разные filter() функции.И это может зависеть от различных факторов, какая функция будет найдена первой.
  • В интерактивном сеансе достаточно загрузить пакеты в правильном порядке, при этом stats загружается автоматически, а затем dplyr.Следовательно, это работает:
    library("knitr")
    library("dplyr")
    knit("exam.Rmd")
  • Мне потребовалось время, чтобы понять, что отличается, когда вы делаете:
    library("exams")
    library("dplyr")
    exams2html("exam.Rmd")
  • Оказывается, что в последнем коде кусок knit() вызывается exams2html() и, следовательно, NAMESPACE пакета exams изменяет поискпуть, потому что он полностью импортирует весь пакет stats.Следовательно, stats::filter() обнаруживается до dplyr::filter(), если код не обрабатывается в среде, в которой было загружено dplyr, например, .GlobalEnv.(Более подробную информацию см. В ответе по адресу @hrbrmstr)

Поскольку для пакета exams нет необходимости загружать весь пакет stats, я изменил NAMESPACE для импортавыборочно только необходимые функции (которые не включают функцию filter()).Пожалуйста, установите версию для разработчиков из R-Forge:

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

И тогда ваш .Rmd можно скомпилировать без dplyr::..., просто включив library("dplyr") - либо в .Rmd, либо перед вызовом exams2html().Оба должны работать сейчас, как и ожидалось.

0 голосов
/ 22 ноября 2018

Используя ваш exams.Rmd, это исходная панель, где я собираюсь нажать cmd-enter:

enter image description here

(я добавил quiet=FALSE чтобы я мог видеть, что происходит).

Вот вывод консоли после cmd-enter:

enter image description here

И вотвывод:

enter image description here

Если вы прочитали до в помощь по knit:

  • envir: Среда, в которой должны оцениваться фрагменты кода, например, parent.frame(), new.env() или globalenv()) .

Таким образом, parent.frame() или globalenv() требуется по сравнению с тем, что вы делали (кажется, вы не совсем понимаете окружение).Вы получаете TRUE от вашего exists() вызова, потому что по умолчанию inherits равно TRUE в функции exists, и это говорит функции "[поиск] вмещающих кадровокружающая среда " (из справки по exists.

. И вы должны быть глубоко обеспокоены исходным кодом и ошибками триггера. Вы используете язык программирования и программное обеспечение с открытым исходным кодом и вы правыlibrary(dplyr) не работал внутри Rmd из-за какого-то ужасного выбора кода в этом «отличном» пакете и того, что вам не нужно указывать, поскольку вы не хотите смотреть на исходный код.

Конец, я больше ничего не могу для тебя сделать. Я просто надеюсь, что другие выиграют от этого.

...