Come già risposto dagli altri, non penso che sia possibile procedere alla successiva iterazione senza restituire qualcosa utilizzando la famiglia di funzioni *apply
.
In questi casi, utilizzo il metodo di Dean MacGregor, con una piccola modifica: io uso NA
anziché NULL
, il che rende più semplice il filtraggio dei risultati.
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)]
Un rapido punto di riferimento
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))]
)
illustra che la soluzione NA
è un po 'più veloce rispetto alla soluzione che utilizza 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
fonte
2017-05-09 07:43:36
Si potrebbe utilizzare la condizione per selezionare un sottoinsieme di la tua lista e memorizza questo sottoinsieme in una variabile separata che fornisci a 'lapply'. – RHertel
@RHertel Dal momento che stanno elaborando un elenco di file e non una porzione di dati già presente nella RAM, è improbabile che abbiano le informazioni per suddividere i file in anticipo. –