Использование rapply для замены NULL-элементов во вложенном списке - PullRequest
1 голос
/ 03 июля 2019

У меня есть следующий список:

my_list = list(list(NULL, '4'), NULL, 5)

str(my_list)
#> List of 3
#>  $ :List of 2
#>   ..$ : NULL
#>   ..$ : chr "4"
#>  $ : NULL
#>  $ : num 5

Я хотел бы узнать, как заменить элементы NULL на NA.Можно ли сделать это, используя rapply?Вот моя попытка:

my_list = list(list(NULL, '4'), NULL, 5)

rapply(my_list, function(x) NA, how = "replace", classes = 'NULL')
#> [[1]]
#> [[1]][[1]]
#> NULL
#> 
#> [[1]][[2]]
#> [1] "4"
#> 
#> 
#> [[2]]
#> NULL
#> 
#> [[3]]
#> [1] 5

Я бы очень хотел заменить NULL элементов, поэтому я указал classes = 'NULL' и how = 'replace'.Но, как вы можете видеть в выводе выше, элементы NULL не заменяются.

Я могу добиться желаемого результата, рекурсивно применяя purrr::modify следующим образом:

library(purrr)

my_list = list(list(NULL, '4', list('y', NULL)), NULL, 5)
str(my_list)
#> List of 3
#>  $ :List of 3
#>   ..$ : NULL
#>   ..$ : chr "4"
#>   ..$ :List of 2
#>   .. ..$ : chr "y"
#>   .. ..$ : NULL
#>  $ : NULL
#>  $ : num 5

replaceNULL <- function(x) {

  modify_if(x, is.list, replaceNULL, .else = ~ifelse(is.null(.), NA, .))

}
replaceNULL(my_list)
#> [[1]]
#> [[1]][[1]]
#> [1] NA
#> 
#> [[1]][[2]]
#> [1] "4"
#> 
#> [[1]][[3]]
#> [[1]][[3]][[1]]
#> [1] "y"
#> 
#> [[1]][[3]][[2]]
#> [1] NA
#> 
#> 
#> 
#> [[2]]
#> [1] NA
#> 
#> [[3]]
#> [1] 5

Создано в 2019-07-03 пакетом Представить (v0.3.0.9000)

Однако мне было интересно, может ли кто-нибудь пролить свет на то, почему rapply не работает?

...