These functions allow you to map over the nodes in a graph, by first
performing a breath first search on the graph and then mapping over each
node in the order they are visited. The mapping function will have access to
the result and search statistics for all the nodes between itself and the
root in the search. To map over the nodes in the reverse direction use
map_bfs_back()
.
map_bfs(root, mode = "out", unreachable = FALSE, .f, ...)
map_bfs_lgl(root, mode = "out", unreachable = FALSE, .f, ...)
map_bfs_chr(root, mode = "out", unreachable = FALSE, .f, ...)
map_bfs_int(root, mode = "out", unreachable = FALSE, .f, ...)
map_bfs_dbl(root, mode = "out", unreachable = FALSE, .f, ...)
The node to start the search from
How should edges be followed? 'out'
only follows outbound
edges, 'in'
only follows inbound edges, and 'all'
follows all edges. This
parameter is ignored for undirected graphs.
Should the search jump to an unvisited node if the search is completed without visiting all nodes.
A function to map over all nodes. See Details
Additional parameters to pass to .f
map_bfs()
returns a list of the same length as the number of nodes
in the graph, in the order matching the node order in the graph (that is, not
in the order they are called). map_bfs_*()
tries to coerce its result into
a vector of the classes logical
(map_bfs_lgl
), character
(map_bfs_chr
), integer
(map_bfs_int
), or double
(map_bfs_dbl
).
These functions will throw an error if they are unsuccesful, so they are type
safe.
The function provided to .f
will be called with the following arguments in
addition to those supplied through ...
:
graph
: The full tbl_graph
object
node
: The index of the node currently mapped over
rank
: The rank of the node in the search
parent
: The index of the node that led to the current node
before
: The index of the node that was visited before the current node
after
: The index of the node that was visited after the current node.
dist
: The distance of the current node from the root
path
: A table containing node
, rank
, parent
, before
, after
,
dist
, and result
columns giving the values for each node leading to the
current node. The result
column will contain the result of the mapping
of each node in a list.
Instead of spelling out all of these in the function it is possible to simply
name the ones needed and use ...
to catch the rest.
Other node map functions:
map_bfs_back()
,
map_dfs()
,
map_dfs_back()
# Accumulate values along a search
create_tree(40, children = 3, directed = TRUE) %>%
mutate(value = round(runif(40)*100)) %>%
mutate(value_acc = map_bfs_dbl(node_is_root(), .f = function(node, path, ...) {
sum(.N()$value[c(node, path$node)])
}))
#> # A tbl_graph: 40 nodes and 39 edges
#> #
#> # A rooted tree
#> #
#> # Node Data: 40 × 2 (active)
#> value value_acc
#> <dbl> <dbl>
#> 1 13 13
#> 2 46 59
#> 3 20 33
#> 4 57 70
#> 5 58 117
#> 6 97 156
#> 7 39 98
#> 8 60 93
#> 9 18 51
#> 10 20 53
#> # ℹ 30 more rows
#> #
#> # Edge Data: 39 × 2
#> from to
#> <int> <int>
#> 1 1 2
#> 2 1 3
#> 3 1 4
#> # ℹ 36 more rows