2015-07-21 96 views
9

我在多个文件的列表上使用了lapply函数。有没有办法可以跳过当前文件的功能而不返回任何内容,只需跳到文件列表中的下一个文件?R:lapply函数 - 跳过当前函数循环

确切地说,我有一个if语句来检查条件,如果语句返回FALSE,我想跳到下一个文件。

+1

你可以使用条件来选择的一个子集您的列表并将此子集存储在您提供给'lapply'的单独变量中。 – RHertel

+0

@RHertel由于他们正在处理文件列表,而不是已经存在的RAM数据,因此他们不太可能提前将信息归入文件子集。 –

回答

8

lapply总会返回与提供的X相同长度的列表。您可以简单地将项目设置为稍后可以过滤的项目。

例如,如果你具备的功能parsefile

parsefile <-function(x) { 
    if(x>=0) { 
    x 
    } else { 
    NULL 
    } 
} 

和你在一个向量runif(10,-5,5)

result<-lapply(runif(10,-5,5), parsefiles) 

那么你就会有你的清单充满了答案,NULL小号

运行

你可以通过做...

子集出
result[!vapply(result, is.null, logical(1))] 
+0

最后一位可以改进:'list.condition < - !vapply(result,is.null,logical(1))'。否则一个很好的答案。 – sdgfsdh

+0

@sdgfsdh很好...编辑反映。 –

+0

不要忘了'!' – sdgfsdh

0

您可以定义一个自定义函数以便在您拨打lapply()时使用。这里是一个遍历文件列表和进程只有在名称不包含3号文件的一些示例代码(有点做作,但希望这横跨得到点):

files <- as.list(c("file1.txt", "file2.txt", "file3.txt")) 

fun <- function(x) { 
    test <- grep("3", x)      // check for files with "3" in their name 
    if (length(test) == 0) {     // replace with your statement here 
     // process the file here 
    } 
    // otherwise do not process the file 
} 

result <- lapply(files, function(x) fun(x)) // call lapply with custom function 
2

正如其他人已经回答的那样,我认为如果不用*apply函数返回一些东西,我不认为你可以继续下一次迭代。

在这种情况下,我使用Dean MacGregor的方法,做了一个小改动:我使用NA而不是NULL,这使得筛选结果更容易。

files <- list("file1.txt", "file2.txt", "file3.txt") 

parse_file <- function(file) { 
    if(file.exists(file)) { 
    readLines(file) 
    } else { 
    NA 
    } 
} 

results <- lapply(files, parse_file) 
results <- results[!is.na(results)] 

快速基准

res_na <- list("a", NA, "c") 
res_null <- list("a", NULL, "c") 
microbenchmark::microbenchmark(
    na = res_na[!is.na(res_na)], 
    null = res_null[!vapply(res_null, is.null, logical(1))] 
) 

说明了NA解决方案是颇有几分比使用该解决方案NULL更快:

Unit: nanoseconds 
expr min lq mean median uq max neval 
    na 0 1 410.78 446 447 5355 100 
null 3123 3570 5283.72 3570 4017 75861 100