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