微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R检查列表是否充满NULL的最快方法

如何解决R检查列表是否充满NULL的最快方法

我有一个函数,在某些情况下可以输出data.table的列表或NULL的列表。该列表如下:

list(NULL,NULL,NULL)

NULL数量可能会发生变化。

检查列表中所有元素是否为NULL的最快方法是什么?

我到目前为止有:

isNullList <- function(x) {
     all(sapply(x,is.null))
}

适用于:

x <- list(NULL,NULL)
isNullList(x)

y <- list("a",NULL)
isNullList(y)

只是想知道是否有更有效的方法

更新:

我已将我的原始尝试与@RonakShah接受的以下答案(isNullList2)进行了基准比较:

microbenchmark::microbenchmark(isNullList(x),isNullList2(x),times = 10000)
Unit: nanoseconds
           expr   min    lq     mean median    uq    max neval
  isNullList(x) 10100 10600 12172.54  11000 11500 370800 10000
 isNullList2(x)   700   800  1066.29    900  1100  29900 10000

解决方法

您可以使用lengths

isNullList <- function(x) all(!lengths(x))

isNullList(x)
#[1] TRUE
isNullList(y)
#[1] FALSE
,

如果列表只能是NULL的列表或data.table的列表,则只需要检查第一个元素:

isNullList <- function(x) is.null(x[[1]])

请注意,即使在您遇到的情况下,检查长度也与检查NULL不同:

library(data.table)
#> Warning: package 'data.table' was built under R version 4.0.2
yes <- list(NULL,NULL,NULL)
no1 <- list(data.table(),data.table(),data.table())
no2 <- list(data.table(lapply(1:100,function(x) rep(x,10))),data.table(lapply(1:200,data.table(lapply(1:300,10))))

isNullList <- function(x) {
  all(sapply(x,is.null))
}

isNullList2 <- function(x) all(!lengths(x))

isNullList3 <- function(x) is.null(x[[1]])

isNullList(yes)
#> [1] TRUE
isNullList(no1)
#> [1] FALSE
isNullList(no2)
#> [1] FALSE

isNullList2(yes)
#> [1] TRUE
isNullList2(no1)
#> [1] TRUE
isNullList2(no2)
#> [1] FALSE

isNullList3(yes)
#> [1] TRUE
isNullList3(no1)
#> [1] FALSE
isNullList3(no2)
#> [1] FALSE

bench::mark(isNullList(yes),isNullList2(yes),isNullList3(yes))
#> # A tibble: 3 x 10
#>   expression         min        mean      median       max `itr/sec` mem_alloc
#>   <chr>         <bch:tm>    <bch:tm>    <bch:tm>  <bch:tm>     <dbl> <bch:byt>
#> 1 isNullLis~ 13200.000ns 16388.566ns 15800.000ns 165.100us    61018.    0.000B
#> 2 isNullLis~   900.000ns  1668.550ns  1100.000ns 141.900us   599323.    0.000B
#> 3 isNullLis~   300.000ns   468.580ns   300.000ns  21.900us  2134107.    0.000B
#> # ... with 3 more variables: n_gc <dbl>,n_itr <int>,total_time <bch:tm>
bench::mark(isNullList(no1),isNullList2(no1),isNullList3(no1))
#> Warning: Each result must equal the first result:
#>   `isNullList(no1)` does not equal `isNullList2(no1)`
#> # A tibble: 3 x 10
#>   expression         min        mean      median       max `itr/sec` mem_alloc
#>   <chr>         <bch:tm>    <bch:tm>    <bch:tm>  <bch:tm>     <dbl> <bch:byt>
#> 1 isNullLis~ 13000.000ns 16217.725ns 15800.000ns 157.100us    61661.    0.000B
#> 2 isNullLis~  3400.000ns  4088.379ns  3800.000ns 158.200us   244596.    0.000B
#> 3 isNullLis~   300.000ns   415.580ns   400.000ns 133.600us  2406276.    0.000B
#> # ... with 3 more variables: n_gc <dbl>,total_time <bch:tm>
bench::mark(isNullList(no2),isNullList2(no2),isNullList3(no2))
#> # A tibble: 3 x 10
#>   expression         min        mean      median       max `itr/sec` mem_alloc
#>   <chr>         <bch:tm>    <bch:tm>    <bch:tm>  <bch:tm>     <dbl> <bch:byt>
#> 1 isNullLis~ 12800.000ns 16139.422ns 15600.000ns 167.600us    61960.    0.000B
#> 2 isNullLis~  2800.000ns  3437.054ns  3200.000ns  21.600us   290947.    0.000B
#> 3 isNullLis~   200.000ns   395.230ns   300.000ns  17.600us  2530172.    0.000B
#> # ... with 3 more variables: n_gc <dbl>,total_time <bch:tm>

reprex package(v0.3.0)于2020-09-18创建

,

我认为这可能是最快的:

ul_bool_hf <- function(lst){is.null(unlist(lst))}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。