lapply 问题:如何进一步精简而不产生错误

lapply Question: How to streamline further without generating errors

我想压缩脚本中的步骤,但我在使用 lapply() 时遇到问题。和往常一样,这似乎是我的代码的问题。任何帮助将非常感激!

library(iNEXT)

sa4 <- list(Bird = list(structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 
1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 
0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 
0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0), .Dim = c(26L, 
6L), .Dimnames = list(Scientific_name = c(" Pycnonotus plumosus", 
"Acridotheres javanicus", "Aegithina tiphia", "Aethopyga siparaja", 
"Anthreptes malacensis", "Aplonis panayensis", "Cacatua goffiniana", 
"Callosciurus notatus", "Cinnyris jugularis", "Copsychus malabaricus", 
"Copsychus saularis", "Dicaeum cruentatum", "Dicrurus paradiseus", 
"Gorsachius melanolophus", "Larvivora cyane", "Macronus gularis", 
"Oriolus chinensis", "Orthotomus atrogularis", "Otus lempiji", 
"Pitta moluccensis", "Pycnonotus goiavier", "Pycnonotus plumosus", 
"Pycnonotus zeylanicus", "Spilopelia chinensis", "Todiramphus chloris", 
"Zosterops simplex"), Sampling_Point = c("SA_01", "SA_02", "SA_03", 
"SA_04", "SA_05", "SA_06")))), Butterfly = list(structure(c(0, 
0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 
0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0), .Dim = c(10L, 
4L), .Dimnames = list(Scientific_name = c("Burara harisa consobrina", 
"Catopsilia pyranthe pyranthe", "Catopsilia scylla cornelia", 
"Delias hyparete metarete", "Eurema sp", "Idea leuconoe clara", 
"Pachliopta aristolochiae asteris", "Phalanta phalantha phalantha", 
"Troides helena cerberus", "Zizula hylax pygmaea"), Sampling_Point = c("SA_01", 
"SA_02", "SA_04", "SA_06")))), Mammal = list(structure(c(0, 1, 
1, 1, 1, 0), .Dim = 2:3, .Dimnames = list(Scientific_name = c("Callosciurus notatus", 
"Unidentified Fruit Bat sp"), Sampling_Point = c("SA_03", "SA_04", 
"SA_05")))), Reptile = list(structure(1, .Dim = c(1L, 1L), .Dimnames = list(
    Scientific_name = "Hemidactylus frenatus", Sampling_Point = "SA_05"))))

我一直在做这件事:

estimateD(sa4$Butterfly, datatype="incidence_raw") #Sampling coverage for butterflies
estimateD(sa4$Mammal, datatype="incidence_raw") #Sampling coverage for mammals
estimateD(sa4$Bird, datatype="incidence_raw") #Sampling coverage for birds
estimateD(sa4$Reptile, datatype="incidence_raw") #Sampling coverage for reptiles

请注意,estimateD(sa4$Reptile, datatype="incidence_raw" 会产生错误,因为它只有一个物种。

是否可以通过lapply压缩以下步骤?在这种情况下,我只有 4 个分类单元,但对于其他项目,可能会更多。我尝试了以下操作,它给了我一条警告消息——实际上与上面的警告消息相同。我想知道如果一个组件出错,lapply 是否会停止工作?

> (lapply(sa4, function(x) estimateD(x, datatype="incidence_raw")) )
Error in `[.data.frame`(tmp, , c(1, 2, 3, 7, 4, 5, 6)) : 
  undefined columns selected
In addition: Warning messages:
1: In FUN(X[[i]], ...) :
  Invalid data type, the element of species by sites presence-absence matrix should be 0 or 1. Set nonzero elements as 1.
2: In log(b/Ub) : NaNs produced

如果我需要提供更多信息,请告诉我?谢谢!

这是 'Reptiles' 的问题,所以如果我们 select list 的前 3 个元素,它应该可以工作

lapply(sa4[1:3], function(x) estimateD(x, datatype="incidence_raw"))

这是一个简单的错误捕获问题。将 tryCatch 环绕您的问题函数调用并获得 error 函数 return 所发生事件的信息。

results <- lapply(sa4, function(x) {
  tryCatch(estimateD(x, datatype="incidence_raw"),
           error = function(e) e) 
})

现在确定哪个运行好吧。

ok <- !sapply(results, inherits, "error")
ok
#   Bird Butterfly    Mammal   Reptile 
#   TRUE      TRUE      TRUE     FALSE

并检查那些做了的。

results[ok]