我想输出路径名列表的子集,以列表元素中的字符(文件名中的前缀)为条件。我可以使用
for loop
来工作,但我想使用 sapply
来完成它,因为我猜这是一种更好的方法。
for loop
有效;结果是文件名以 500 或更高开头的路径名列表。 Sapply
不起作用; i
没有按照我的预期进行迭代,但将元素附加到新列表时可能会出现其他问题。
# -----------------------------------------
# add pathnames to files that have a prefix of less than 500,
# to a new list
# -----------------------------------------
# make list
# myList <- list.files(path = "D:/test", pattern = "*.txt")
myList <- list("D:/test/472_a.txt", "D:/test/303_b.txt", "D:/test/500_a.txt", "D:/test/505_b.txt", "D:/test/700_a.txt")
# preallocate subsetted list
myListSubset <- vector("list", length = length(myList))
# -----------------------------------------
# for loop - this works
# -----------------------------------------
for (i in 1:length(myList)) {
print(paste("i is", i))
print(paste(i, "element of myList is", myList[i]))
swath <- str_sub(basename(paste(myList[i], collapse = "")), 1, 3)
# only add swaths ge to 500 to the subsetted list
if (swath >= 500) {
print(paste("swath #", swath))
myListSubset[[i]] <- paste(myList[i], collapse = "")
}
}
# remove Null elements
print(myListSubset)
myListSubset[sapply(myListSubset, is.null)] <- NULL
print(myListSubset)
# -----------------------------------------
# -----------------------------------------
# sapply - this does not work
# -----------------------------------------
i <- 1
sapply(myList, function(s){
swath <- str_sub(basename(s), 1, 3) # swath is the 1st 3 digits in file name
print(paste("swath #", swath))
if (swath >= 500) {
print(paste("list element is", s, "and the class is", class(s)))
print(paste("i is", i, "and the class is", class(i)))
myListSubset[[i]] <- s
i <- (i + 1)
print(paste("i is", i))
}
}
)
# remove Null elements
print(myListSubset)
myListSubset[sapply(myListSubset, is.null)] <- NULL
print(myListSubset)
# -----------------------------------------
像这样?没有循环。
myList <- list("D:/test/472_a.txt", "D:/test/303_b.txt", "D:/test/500_a.txt", "D:/test/505_b.txt", "D:/test/700_a.txt")
i <- myList |>
unlist() |>
basename() |>
grepl("^[5-9]", x = _)
myList[i]
#> [[1]]
#> [1] "D:/test/500_a.txt"
#>
#> [[2]]
#> [1] "D:/test/505_b.txt"
#>
#> [[3]]
#> [1] "D:/test/700_a.txt"
创建于 2024-09-27,使用 reprex v2.1.0