在R中处理大量对象

在R中处理大量对象,r,R,我有一个很大的对象列表(比如100k个元素)。每个元素都必须由一个函数“process”来处理,但我想分块处理。。。比如说20次,因为我想将处理结果保存到硬盘文件中,并保持操作内存空闲 我是新来R的,我知道它应该包含一些应用魔法,但我不知道如何去做(现在) 任何指导都将不胜感激 一个小例子: objects <- list(); for (i in 1:100){ objects <- append(objects, 500); } objects; proce

我有一个很大的对象列表(比如100k个元素)。每个元素都必须由一个函数“process”来处理,但我想分块处理。。。比如说20次,因为我想将处理结果保存到硬盘文件中,并保持操作内存空闲

我是新来R的,我知道它应该包含一些应用魔法,但我不知道如何去做(现在)

任何指导都将不胜感激

一个小例子:

 objects <- list();
 for (i in 1:100){
 objects <- append(objects, 500);
 }
 objects;





 processOneElement <- function(x){
 x/20 + 23;
 }

objects根据您所给出的,这是我可以建议的答案。假设您的列表存储在
list.object

lapply(seq(1, length(list.object), by=20), function(idx) {
    # here idx will be 1, 21, 41 etc...
    idx2 <- min(idx+20-1, length(list.object))
    # do what you want here.. 
    batch.20.processed <- lapply(idx:idx2, function(x) {
        process(list.object[[x]]) # passes idx:idx2 indices one at a time
    })
    # here you have processed list with 20 elements
    # finally write to file
    lapply(1:20, function(x) {
        write.table(batch.20.processed[[x]], ...)
        # where "..." is all other allowed arguments to write.table
        # such as row.names, col.names, quote etc.
        # don't literally pass "..." to write.table
    })
}
lappy(seq(1,长度(list.object),by=20),函数(idx){
#这里的idx将是1、21、41等。。。

idx2若要获得指导,您必须首先以可复制代码的形式提供指导。到目前为止,我已经添加了可复制代码。实际上,我已经加载了所有数据。我将把处理批处理的结果保存到文件中。我还在原始问题中添加了一些代码,即每个元素的可复制处理将导致一个相对稳定的对象我需要处理前20个保存结果并重复这个过程,直到我完成我尝试的lappy(obejcts,FUN=process)但是输出太大了,我使用了您的代码作为指导,并在示例中上载了工作代码。谢谢。这看起来非常有用,但我在FUN(1:20[[1L]],…)中遇到了一个错误
错误:“…”用于错误的上下文
,包含500项。您能再次检查该函数吗?我不熟悉
的正确用法。
lapply(seq(1, length(list.object), by=20), function(idx) {
    # here idx will be 1, 21, 41 etc...
    idx2 <- min(idx+20-1, length(list.object))
    # do what you want here.. 
    batch.20.processed <- lapply(idx:idx2, function(x) {
        process(list.object[[x]]) # passes idx:idx2 indices one at a time
    })
    # here you have processed list with 20 elements
    # finally write to file
    lapply(1:20, function(x) {
        write.table(batch.20.processed[[x]], ...)
        # where "..." is all other allowed arguments to write.table
        # such as row.names, col.names, quote etc.
        # don't literally pass "..." to write.table
    })
}