use*_*880 11 r function lapply
我在多个文件列表中使用lapply函数.有没有一种方法可以跳过当前文件上的函数而不返回任何内容,只是跳到文件列表中的下一个文件?
确切地说,我有一个检查条件的if语句,如果语句返回FALSE,我想跳到下一个文件.
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)
正如其他人已经回答的那样,我认为您无法在不使用*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)