1

オブジェクトのリストがたくさんあります(たとえば、100k要素)。各要素は関数「process」で処理する必要がありますが、処理をチャンクで実行したいと思います。たとえば、処理結果をハードドライブファイルに保存し、動作メモリを空けておきたいので、たとえば20パスとします。

私はRを初めて使用し、適用魔法を使用する必要があることは知っていますが、その方法は(まだ)わかりません。

任意のガイダンスをいただければ幸いです。

小さな例:

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





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

最初の20個の要素を一度に処理して結果を保存し、次に次の20個の要素を2回目に処理して結果を保存したい...など。

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

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

results <- lapply(objects, FUN=process)



index <- seq(1, length(objects), by=20);
lapply(index, function(idx1) {
idx2 <- min(idx1+20-1, length(objects));
batch <- lapply(idx:idx2, function(x) {
process(objects[[x]]);
})

write.table(batch, paste("batch", idx1, sep=""));
})
4

1 に答える 1

2

あなたが与えたもので、これは私が提案できる答えです。リストがに保存されていると仮定すると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
    })
}
于 2013-01-23T15:14:04.433 に答える