Wie bereits von den anderen beantwortet, glaube ich nicht, dass Sie mit der nächsten Iteration fortfahren können, ohne etwas mit der *apply
Familie von Funktionen zurückgeben.
In solchen Fällen verwende ich Dean MacGregor-Methode, mit einer kleinen Änderung: Ich verwende NA
anstelle von NULL
, die das Filtern der Ergebnisse einfacher macht.
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)]
Eine schnelle Benchmark
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))]
)
zeigt, dass die NA
Lösung ziemlich viel schneller als die Lösung, die NULL
verwendet:
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
Sie den Zustand einer Teilmenge von wählen verwenden könnte Ihre Liste und speichern Sie diese Teilmenge in einer separaten Variable, die Sie an 'lapply' liefern. – RHertel
@RHertel Da sie eine Liste von Dateien und nicht ein bereits im RAM gespeichertes Datenstück verarbeiten, ist es unwahrscheinlich, dass sie die Informationen haben, um die Dateien im Voraus zu unterteilen. –