R:lappy函数-跳过当前函数循环
我在多个文件的列表上使用lappy函数。有没有一种方法可以跳过当前文件上的函数而不返回任何内容,直接跳到文件列表中的下一个文件R:lappy函数-跳过当前函数循环,r,function,lapply,R,Function,Lapply,我在多个文件的列表上使用lappy函数。有没有一种方法可以跳过当前文件上的函数而不返回任何内容,直接跳到文件列表中的下一个文件 确切地说,我有一个if语句来检查条件,如果该语句返回FALSE,我想跳到下一个文件 您可以定义一个自定义函数,用于调用lappy()。下面是一些示例代码,它在文件列表上迭代,并且仅当文件名不包含数字3时才处理文件(有点做作,但希望这能说明问题): 文件lappy将始终返回与所提供的X长度相同的列表。您可以简单地将项目设置为稍后可以过滤掉的内容 例如,如果您有函数pars
确切地说,我有一个if语句来检查条件,如果该语句返回FALSE,我想跳到下一个文件 您可以定义一个自定义函数,用于调用
lappy()
。下面是一些示例代码,它在文件列表上迭代,并且仅当文件名不包含数字3时才处理文件(有点做作,但希望这能说明问题):
文件lappy
将始终返回与所提供的X
长度相同的列表。您可以简单地将项目设置为稍后可以过滤掉的内容
例如,如果您有函数parsefile
parsefile <-function(x) {
if(x>=0) {
x
} else {
NULL
}
}
然后,您将在列表中填写答案和NULL
s
您可以通过执行以下操作将NULL
s子集化:
result[!vapply(result, is.null, logical(1))]
正如其他人已经回答的那样,我认为如果不使用*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)]
您可以使用该条件选择列表的子集,并将该子集存储在一个单独的变量中,您可以将该变量提供给lappy
@RHertel,因为他们正在处理文件列表,而不是已经存在于RAM中的数据。他们不太可能提前获得文件子集的信息。最后一位可以改进:list.condition我还将parsefiles
重命名为parsefile
,因为它一次只需要一个文件,但这太挑剔了@sdgfsdh只是为了你我做到了
result[!vapply(result, is.null, logical(1))]
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))]
)
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