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