Data.table ошибка при использовании через knitr, gWidgetsWWW

Я экспериментирую с gWidgetsWWW и обнаружил странную ошибку. Я создал кнопку с обработчиком для knit2html отчета, в котором использовался оператор присваивания data.table ": =". Сообщение вернулось с этой ошибкой:

Ошибка:: = определена для использования только в j и (в настоящее время) только один раз; т.е. DT [i, col: = 1L] и DT [, newcol: = sum (colB), by = colA] в порядке, но не DT [i, col]: = 1L, а не DT [i] $col: = 1L, а не DT [, {newcol1: = 1L; newcol2: = 2L}]. См. Справку ( ": =" ). Check is.data.table(DT) имеет значение TRUE.

Отчет генерирует, как ожидалось, с помощью knit2html напрямую, а также через кнопку RStudio "Вязать HTML", поэтому я не уверен, почему он терпит неудачу, когда обработчик knit2html вызывается обработчиком.

Вот окно gWidgetsWWW "test_gui.R":

library(gWidgetsWWW)
library(knitr)

w<-gwindow("Test Window")
g<-ggroup(horizontal=F,cont=w)
b<-gbutton("Report Button",cont=g,handler=function(h,...){
    knit2html("test_report.Rmd")
    localServerOpen("test_report.html")
})

visible(w)<-T

Вот пример R Markdown Doc, который вызывает ошибку:

Test Report
===========

```{r test_chunk}
library(data.table)

df<-data.frame(State=rownames(USArrests),USArrests)

data.table(df)[,State:=tolower(State)]

```

Не знаю, почему, но когда я вызываю localServerOpen ( "test_gui.R" ) и нажимаю кнопку, я получаю ошибку...

Любые идеи?

Ответ 1

Кажется, это проблема среды. Вероятно, это проблема между data.table и gWidgetsWWW. На стороне knitr существует хотя бы одно решение, которое должно указывать среду для knitr как глобальную среду, например.

knit2html("test_report.Rmd", envir = globalenv())

Edit:

Чтобы проиллюстрировать эту проблему, не имеет значения для knitr, попробуйте следующее:

library(gWidgetsWWW)

w<-gwindow("Test Window")
g<-ggroup(horizontal=F,cont=w)
b<-gbutton("Report Button",cont=g,handler=function(h,...){
  library(data.table)
  df<-data.frame(State=rownames(USArrests),USArrests)
  print(data.table(df)[,State:=tolower(State)])
})

visible(w)<-TRUE

Сохраните его как test_gui.R и

library(gWidgetsWWW)
localServerOpen('test_gui.R')

Нажмите кнопку, и вы также увидите ошибку.

Ответ 2

Благодаря Zach и Yihui, это теперь зафиксировано в data.table v1.8.3 на R-Forge.

o  gWidgetsWWW wasn't known as data.table aware, even though it mimics
   executing code in .GlobalEnv, #2340. data.table is now gWidgetsWWW aware.  
   Further packages can be added if required by changing a new variable
      data.table:::cedta.override
   by using assignInNamespace(). Thanks to Zach Waite and Yihui Xie for
   investigating and providing reproducible examples.

Полная команда assignInNamespace:

assignInNamespace("cedta.override",
                  c(data.table:::cedta.override,"<nsname>"),
                  "data.table")

Если вы не уверены в точном имени пространства имен, установите options(datatable.verbose=TRUE), снова запустите строку нарушения, а выходное сообщение должно указать вам, какое имя пространства имен было принято не для того, чтобы быть доступным для data.table.

Во время этого редактирования пакеты в whitelist data.table(v1.9.3):

> data.table:::cedta.override
[1] "gWidgetsWWW" "statET"      "FastRWeb"    "slidify"     "rmarkdown"  

Они, как правило, представляют собой пакеты, которые вводят код пользователя в качестве входных данных и запускают их в своей среде.