Вы можете использовать purrr::map_depth
для сортировки вложенных списков, а затем проверить списки с помощью setdiff
. Если длина при вызове setdiff
равна 0, списки содержат одинаковые элементы. Хитрость в том, что setdiff
будет давать разные результаты в зависимости от порядка его аргументов, так что в итоге вы вызываете его дважды, по одному с каждого направления. Это похоже на двойную проверку, выполненную в testthat::expect_setequal
.
Для простоты я оборачиваю это в функцию. Вместо этого вы могли бы сделать то же самое с комбинацией all
и %in%
, но это казалось компактным.
a1 <- list("PL+", "PW-", "PL+", "PW-", c("PL+", "PW-"))
b1 <- list("PL+", c("PW-", "PL+"), "PL+", "PW-", "PW-")
nested_equal <- function(l1, l2) {
left_diff <- setdiff(
purrr::map_depth(l1, 1, sort),
purrr::map_depth(l2, 1, sort)
)
right_diff <- setdiff(
purrr::map_depth(l2, 1, sort),
purrr::map_depth(l1, 1, sort)
)
(length(left_diff) == 0) & (length(right_diff) == 0)
}
nested_equal(a1, b1)
#> [1] TRUE
Несколько тестовых случаев с разными элементами:
a2 <- list("PL+", "PW-", "PL+", "PW-", c("PL+", "PW-"), "A")
b2 <- list("PL+", c("PW-", "PL+"), "PL+", "PW-", "PW-")
nested_equal(a2, b2)
#> [1] FALSE
a3 <- list("PL+", "PW-", "PL+", "PW-", c("PL+", "PW-"))
b3 <- list("PL+", c("PW-", "PL+", "X"), "PL+", "PW-", "PW-", "B")
nested_equal(a3, b3)
#> [1] FALSE
Чтобы соответствовать тестам testthat
, вы можете проверить значение true или false, возвращаемое nested_equal
в expect_equal
, expect_true
, expect_false
.