数据表和R';s省略(即';.';):按引用传递似乎不起作用

数据表和R';s省略(即';.';):按引用传递似乎不起作用,r,data.table,R,Data.table,我试图用一种特殊的方式操作一个大数据表(~37MB):出于其他(不相关的)原因,我实现了一个类似钩子的结构,这意味着整个过程就像 1) 从磁盘加载data.table 2) 发射一个特定的钩子 3) 钩子结构查找此名称,并检查用户(=me:)是否已将函数绑定到此钩子,如果已绑定,则调用它 4) 进一步处理数据 函数如下所示: data = readRDS(pathToFile) data = data.table(data) fireHook("After_data_read", data, [

我试图用一种特殊的方式操作一个大数据表(~37MB):出于其他(不相关的)原因,我实现了一个类似钩子的结构,这意味着整个过程就像

1) 从磁盘加载data.table

2) 发射一个特定的钩子

3) 钩子结构查找此名称,并检查用户(=me:)是否已将函数绑定到此钩子,如果已绑定,则调用它

4) 进一步处理数据

函数如下所示:

data = readRDS(pathToFile)
data = data.table(data)
fireHook("After_data_read", data, [some other parameters])
some_more_processing(data)
fireHook周围的区域看起来像

hooksRegistered = list(
  "After_data_read" = function(data, ...) { 
                        # do some stuff 
                      }


)

fireHook = function(hookName, ...) {
  for (hookNameRegistered in names(hooksRegistered)) {
    if (hookName == hookNameRegistered) {
      func = .global.hooksRegistered[[hookName]]
      func(hookName, ...)
    }
  }
}
请注意,需要将已经是data.table的对象再次强制转换到该对象中(否则,passby引用将不起作用),请参见和


问题:这一行:
func(hookName,…)
需要花费很长时间(>5分钟)


调试器从未真正进入函数(因此它不是函数中需要很长时间的代码),我用小data.tables对它进行了测试,它工作正常。此外,我还注意到以下几点似乎有效:

fireHook = function(hookName, ...) {
  args = list(...)
  for (hookNameRegistered in names(.global.hooksRegistered)) {
    if (hookName == hookNameRegistered) {
      func = .global.hooksRegistered[[hookName]]
      func(hookName, args)
    }
  }
}
(注意,我用
列表(…)
替换了
..
)。在我看来,在使用
时,R似乎试图复制整个表。这是正确的/需要的吗?还是我用错了

问候,


FW

您使用的是什么版本的R。我模模糊糊地记得,这可能在最近的版本中有所改变。
version
给了我版本字符串
R version 3.1.1(2014-07-10)
。。。所以我想这不是最新的,也不是太旧的。。。