在RevoScaleR函数中使用transformEnvir后环境不符合预期

时间:2014-06-18 07:12:21

标签: r revolution-r microsoft-r

我有一个函数,我正在使用rxXdfToDataFrame读取xdf文件,并在我的表达式中使用rowSelection的变量。如果我没有通过transformEnvir=environment(),则找不到变量。我的问题是,在使用transformEnvir调用该函数后,我似乎无法可靠地访问.GlobalEnv。如果我将数字硬编码到rowSelection我不需要使用transformEnvir,一切正常。我尝试设置环境,但我不确定我是否正确地做到了。

以下代码重现了我的问题:

envirtest = function()
{
   require(data.table)
   df = data.frame(x=1:10)
   selectnum = 5
   rxDataFrameToXdf(df, "testxdf.xdf")
   testdf = rxXdfToDataFrame("testxdf.xdf",rowSelection=(x==selectnum),transformEnvir=environment())
   testdt = setDT(testdf)
}

发生错误:

Error in envirtest() : could not find function "setDT"

但是,如果使用setDT()代替data.table::setDT(),则执行该函数。

编辑:我忘了提到我在没有transformEnvir设置的情况下尝试过,一切正常。此外,tables()已更改为setDT()以避免可能的混淆。

1 个答案:

答案 0 :(得分:2)

以下是您的问题的解决方案,以及部分解释:

  • 转换完成后,转换环境将被清除。
  • 这意味着在启动rx-function之前创建环境然后将任何对象添加到此环境中会更安全。

具体地:

env <- new.env()
env$selectnum = 5

设置你的功能:

envirtest = function()
{
  require(data.table)
  df = data.frame(x=1:10)
  env <- new.env()
  env$selectnum = 5

  rxDataFrameToXdf(df, "testxdf.xdf", overwrite=TRUE)
  testdf <- rxXdfToDataFrame("testxdf.xdf",
                             rowSelection=(x==selectnum),
                             transformEnvir=env
  )
  setDT(testdf)
}

现在尝试一下:

x <- envirtest()

Rows Read: 10, Total Rows Processed: 10, Total Chunk Time: 0.006 seconds 
Rows Processed: 1
Time to read data file: 0.00 secs.
Time to convert to data frame: less than .001 secs.

str(x)

Classes ‘data.table’ and 'data.frame':  1 obs. of  1 variable:
 $ x: int 5
 - attr(*, ".internal.selfref")=<externalptr>