1

我有一个函数,我正在使用 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() 以避免可能的混淆。

4

1 回答 1

2

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

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

具体来说:

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> 
于 2014-06-19T07:16:44.440 回答