# to test -----------------------------------------------------------------
# attributes of nb class
# attributes of wt columns such as style
# check lengths on nbs and weights
# check edge lists match weight list values
# tests -------------------------------------------------------------------
test_that("nbs is spdep compliant", {
skip_on_cran()
skip_on_ci()
library(sfdep)
library(dplyr)
library(tidygraph)
library(sfnetworks)
# create object with edge list and neighbor list
net <- as_sfnetwork(roxel, directed = FALSE) |>
tidygraph::activate("edges") |>
mutate(len = edge_length()) |>
tidygraph::activate("nodes") |>
mutate(
nb = node_get_nbs(),
elist = node_get_edge_list(),
wt = node_get_edge_col(nb, "len")
)
node_df <- as_tibble(net)
edge_df <- net %E>%
as_tibble()
nb <- as_tibble(net)[["nb"]]
# test that nb does not include self
expect_equal(attr(nb, "self.included"), FALSE)
# that nb is a nb class & list class
expect_s3_class(nb, c("nb", "list"))
# expect identical adjacency lists
ig_adj_list <- igraph::get.adjlist(net)
expect_equal(
nb,
lapply(ig_adj_list, function(.x) unique(.x)),
ignore_attr = TRUE
)
# edge list column is identical to igraph
n2 <- mutate(net, edge_list = node_get_edge_list())
el <- as_tibble(n2)[["edge_list"]]
elig <- lapply(igraph::get.adjedgelist(net), as.integer)
expect_equal(el, elig)
# attr edge col has same lengths as nb
expect_equal(
lengths(node_df[["nb"]]),
lengths(node_df[["wt"]])
)
# "edge list contains correct neighbor nodes
nb <- node_df[["nb"]]
elist <- node_df[["elist"]]
correct_indexes <- logical(length(nb))
for (i in seq_along(elist)) {
tmp <- dplyr::slice(as_tibble(edge_df), elist[[i]])
res <- all(nb[[i]] %in% c(tmp[["from"]], tmp[["to"]]))
correct_indexes[i] <- res
}
expect_true(all(correct_indexes))
# "edge_get_col retrieves correct indexes
# check that edge list correctly matches neighbors
# the ith observation should all be from i to others
elist <- node_df[["elist"]]
# test that adjacency matrix matches edge list
# each element in the edge list should include `i` either in
# from or to as many times as there are neighbors
adj_vec <- integer(length(elist))
for (i in seq_along(elist)) {
tmp <- dplyr::slice(as_tibble(edge_df), elist[[i]])
res <- sum(c(tmp[["from"]], tmp[["to"]]) == i)
adj_vec[i] <- res
}
expect_equal(lengths(elist), adj_vec)
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.