11

gWidgetsWWW を試しているところ、奇妙なエラーが発生しました。data.table 代入演算子 ":=" を使用したレポートを Knit2html するためのハンドラーを含むボタンを作成しました。レポートは次のエラーで返されました。

エラー: := は j でのみ使用するように定義されており、(現在) 1 回のみ使用されます。つまり、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")

正確な名前空間名 set がわからない場合は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ですgWidgetsWWWknitrの側では、少なくとも1つの解決策があります。それは、環境をグローバル環境として指定することです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 に答える