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"
Они, как правило, представляют собой пакеты, которые вводят код пользователя в качестве входных данных и запускают их в своей среде.