我正在尝试使用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;)并单击按钮时,我收到错误...
有什么想法吗?
答案 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.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')
单击按钮,您还会看到错误。