通过knitr,gWidgetsWWW使用时出现data.table错误

时间:2012-10-28 02:55:38

标签: r data.table knitr gwidgets

我正在尝试使用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生成,也可以通过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(&#34; test_gui.R&#34;)并单击按钮时,我收到错误...

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

感谢Zach和Yihui,现在修复了R-Forge上的data.table v1.8.3。

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。

在编辑时,data.table的白名单(v1.9.3)上的包是:

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

它们往往是将用户代码作为输入并在自己的环境中运行的包。

答案 1 :(得分:4)

这似乎是一个环境问题。这可能是data.tablegWidgetsWWW之间的问题。在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')

单击按钮,您还会看到错误。