Ошибка 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}]. Пожалуйста, смотрите помощь (": ="). Проверьте, is.data.table (DT) ИСТИНА.

Отчет генерируется, как и ожидалось, с использованием knit2html напрямую, а также с помощью кнопки «Knit HTML» в RStudio, поэтому я не уверен, почему он не работает, когда обработчик вызывает 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") и нажимаю кнопку, я получаю сообщение об ошибке ...

Есть идеи?

 Zach Waite28 окт. 2012 г., 07:36
Я использую data.table 1.82
 jverzani28 окт. 2012 г., 20:15
ЛинияlocalServerOpen("test_report.html") должно бытьbrowseURL("test_report.html"), Вы также можете использовать gWidgetsWWW2 (на github). У него меньше проблем, чем у gWidgetsWWW и еще несколько функций.
 Andrie28 окт. 2012 г., 06:19
Это работает на моей машине. Какая версияdata.table ты используешь?
 mnel28 окт. 2012 г., 07:05
data.table(df)[,State:=tolower(State)] это нестандартное использование. Я думаю, что было бы безопаснее сделатьdf <- as.data.table(df) тогдаdf[,State:=tolower(State)] в противном случае вы присваиваете объект по ссылке, я бы не знал, как ссылаться.
 Matt Dowle28 окт. 2012 г., 08:55
@Andrie Anonymous: = (на неназванном объекте) должно быть в порядке. Я делаю это довольно много. Не могу понять, что не так, поскольку он работает для вас, а у Зака есть 1.8.2 ...

Ответы на вопрос(2)

Решение Вопроса

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

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

Редактировать:

Для иллюстрации этого вопроса не имеет отношения к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')

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

 Matt Dowle29 окт. 2012 г., 18:52
Это интересно! Видетьэтот ответ о cedta для фона. я могу видеть этоdata.table должно бытьknitr-aware. С другой стороны, я думалknitr точно так же, как если бы код R был вставлен в консоль? Я более чем рад внести изменения вdata.table.
 Matt Dowle30 окт. 2012 г., 01:23
Сейчас исправлено. Спасибо за отличный пример.
 Zach Waite29 окт. 2012 г., 14:28
Спасибо Yihui, кажется, это решает проблему.
 Matt Dowle29 окт. 2012 г., 22:13
Большое спасибо. Это выглядит какdata.table вопрос тогда, я посмотрю. Подано какошибка # 2340.
 Yihui Xie29 окт. 2012 г., 20:30
@MatthewDowle только что понял, что это неknitr вопрос; похоже, это связано сgWidgetsWWW (Я думаю, это из-за среды, в которойhandler работает; не совсем уверен); в любом случае, вы можете поговорить с @jverzani

Благодаря 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 (v1.9.3):

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

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

 Stéphane Laurent12 мар. 2015 г., 18:29
У меня проблема сslidify, Это должно работать в настоящее время?
 mbask16 июн. 2013 г., 16:41
Это выглядит какslidify + data.table показать ту же проблему, что и вопрос ОП. Нужно добавитьassignInNamespace("cedta.override","slidify","data.table") заявление.
 Matt Mills11 июл. 2017 г., 16:30
Просто для наглядности мне фактически пришлось использовать «cedta.pkgEvalsUserCode» вместо «cedta.override» вassignInNamespace позвоните, чтобы получитьezknitr пакет должен быть data.table в курсе.
 Matt Dowle18 авг. 2014 г., 15:38
@mbask Пропустил ваш комментарий в то время, извините.slidify сейчас добавлено. Благодарю.
 Stéphane Laurent12 мар. 2015 г., 18:40
Хорошо, теперь это работает. Я должен был добавитьpoirot в пространстве имен.

Ваш ответ на вопрос