R:lapply函数 - 跳过当前函数循环

use*_*880 11 r function lapply

我在多个文件列表中使用lapply函数.有没有一种方法可以跳过当前文件上的函数而不返回任何内容,只是跳到文件列表中的下一个文件?

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

Dea*_*gor 9

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

例如,如果你有这个功能 parsefile

parsefile <-function(x) {
  if(x>=0) {
    x
  } else {
    NULL
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你在矢量上运行它 runif(10,-5,5)

result<-lapply(runif(10,-5,5), parsefile)
Run Code Online (Sandbox Code Playgroud)

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

您可以NULL通过以下方式对s进行子集化...

result[!vapply(result, is.null, logical(1))]
Run Code Online (Sandbox Code Playgroud)


Flo*_*gly 5

正如其他人已经回答的那样,我认为您无法在不使用*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)]
Run Code Online (Sandbox Code Playgroud)

快速基准

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))]
)
Run Code Online (Sandbox Code Playgroud)

说明该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
Run Code Online (Sandbox Code Playgroud)