如何解决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 举报,一经查实,本站将立刻删除。