使用rapply替换嵌套列表中的NULL元素

时间:2019-07-03 10:09:06

标签: r list data-manipulation purrr

我有以下列表:

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

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

我想学习如何用NA替换NULL元素。是否可以使用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

我想用rapply替换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

reprex package(v0.3.0.9000)于2019-07-03创建

但是,我想知道是否有人可以阐明为什么rapply无法正常工作吗?

0 个答案:

没有答案