lapply Вопрос: Как оптимизировать дальше, не генерируя ошибок - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь сжать шаги в моем скрипте, но у меня проблемы с 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

Обратите внимание, что оценка D (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

Пожалуйста, дайте мне знать, если мне нужно предоставить больше информация? Спасибо!

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Это простая проблема с перехватом ошибок. Оберните tryCatch вокруг вызова вашей проблемной функции и получите функцию error, которая возвращает информацию о том, что произошло.

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]
1 голос
/ 27 апреля 2020

Это проблема с «Рептилиями», поэтому, если мы выберем первые 3 элемента list, он должен работать

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