我试图以一种特殊的方式操纵一个大数据表(~37 MB):由于其他(无关)原因,我实现了一个'hook'结构意味着整个过程就像
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的对象再次投射到其中(否则传递引用不起作用),请参阅Adding new columns to a data.table by-reference within a function not always working和{{ 3}}
问题:这一行: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)
}
}
}
(注意我用...
替换了list(...)
)。对我来说,似乎R在使用...
时试图复制整个表格。这是对的吗?或者我使用它错了吗?
的问候,
FW