Như đã được trả lời bởi những người khác, tôi không nghĩ rằng bạn có thể tiếp tục lặp lại tiếp theo mà không trả lại một cái gì đó bằng cách sử dụng các chức năng của *apply
.
Trong trường hợp này, tôi sử dụng phương pháp Dean MacGregor, với một thay đổi nhỏ: Tôi sử dụng NA
thay vì NULL
, giúp lọc kết quả dễ dàng hơn.
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)]
Một điểm chuẩn nhanh
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))]
)
minh họa rằng giải pháp NA
là nhanh hơn so với các giải pháp sử dụng NULL
khá một chút:
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
Nguồn
2017-05-09 07:43:36
Bạn có thể sử dụng điều kiện để chọn một tập hợp con của danh sách của bạn và lưu trữ tập hợp con này trong một biến riêng biệt mà bạn cung cấp cho 'lapply'. – RHertel
@RHertel Vì chúng đang xử lý danh sách các tệp và không phải là một phần dữ liệu đã có trong RAM nên chúng không có thông tin để đặt trước các tệp. –