11

我正在试验 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) 是否为 TRUE。

该报告直接使用 knit2html 以及通过 RStudio 的“Knit 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") 并单击按钮时,出现错误...

有任何想法吗?

4

2 回答 2

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"  

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

于 2012-10-30T00:22:21.913 回答
4

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

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

于 2012-10-28T21:25:49.667 回答