DiagrammeR (version 0.9.0)

trav_in_edge: Traverse from one or more selected nodes onto adjacent, inward edges

Description

From a graph object of class dgr_graph move to incoming edges from a selection of one or more selected nodes, thereby creating a selection of edges. An optional filter by edge attribute can limit the set of edges traversed to.

Usage

trav_in_edge(graph, conditions = NULL, copy_attrs_from = NULL)

Arguments

graph

a graph object of class dgr_graph.

conditions

an option to use filtering conditions for the traversal.

copy_attrs_from

providing a node attribute name will copy those node attribute values to the traversed edges. If the edge attribute already exists, the values will be merged to the traversed edges; otherwise, a new edge attribute will be created.

Value

a graph object of class dgr_graph.

Examples

Run this code
# NOT RUN {
# Set a seed
set.seed(23)

# Create a simple graph
graph <-
  create_graph() %>%
  add_n_nodes(
    2, type = "a",
    label = c("asd", "iekd")) %>%
  add_n_nodes(
    3, type = "b",
    label = c("idj", "edl", "ohd")) %>%
  add_edges_w_string(
    "1->2 1->3 2->4 2->5 3->5",
    rel = c(NA, "A", "B", "C", "D"))

# Create a data frame with node ID values
# representing the graph edges (with `from`
# and `to` columns), and, a set of numeric values
df <-
  data.frame(
    from = c(1, 1, 2, 2, 3),
    to = c(2, 3, 4, 5, 5),
    values = round(rnorm(5, 5), 2))

# Join the data frame to the graph's internal
# edge data frame (edf)
graph <- graph %>% join_edge_attrs(df)

get_edge_df(graph)
#>   id from to  rel values
#> 1  1    1  2 <NA>   6.00
#> 2  2    1  3    A   6.11
#> 3  3    2  4    B   4.72
#> 4  4    2  5    C   6.02
#> 5  5    3  5    D   5.05

# Perform a simple traversal from nodes to
# inbound edges with no conditions on the
# nodes traversed to
graph %>%
  select_nodes_by_id(2) %>%
  trav_in_edge() %>%
  get_selection()
#> [1] 1

# Traverse from node `2` to any inbound
# edges, filtering to those edges that have
# NA values for the `rel` edge attribute
graph %>%
  select_nodes_by_id(2) %>%
  trav_in_edge(
    conditions = "is.na(rel)") %>%
  get_selection()
#> [1] 1

# Traverse from node `2` to any inbound
# edges, filtering to those edges that do
# not have NA values for the `rel` edge
# attribute (since there are no allowed
# traversals, the selection of node `2`
# is retained)
graph %>%
  select_nodes_by_id(2) %>%
  trav_in_edge(
    conditions = "!is.na(rel)") %>%
  get_selection()
#> [1] 2

# Traverse from node `5` to any inbound
# edges, filtering to those edges that have
# numeric values greater than `5.5` for
# the `rel` edge attribute
graph %>%
  select_nodes_by_id(5) %>%
  trav_in_edge(
    conditions = "values > 5.5") %>%
  get_selection()
#> [1] 4

# Traverse from node `5` to any inbound
# edges, filtering to those edges that
# have values equal to `D` for the `rel`
# edge attribute
graph %>%
  select_nodes_by_id(5) %>%
  trav_in_edge(
    conditions = "rel == 'D'") %>%
  get_selection()
#> [1] 5

# Traverse from node `5` to any inbound
# edges, filtering to those edges that
# have values in the set `C` and `D` for
# the `rel` edge attribute
graph %>%
  select_nodes_by_id(5) %>%
  trav_in_edge(
    conditions = "rel %in% c('C', 'D')") %>%
  get_selection()
#> [1] 4 5

# Traverse from node `5` to any inbound
# edges, and use multiple conditions for the
# traversal (using a vector in `conditions`
# creates a set of `AND` conditions)
graph %>%
  select_nodes_by_id(5) %>%
  trav_in_edge(
    conditions = c(
      "rel %in% c('C', 'D')",
      "values > 5.5")) %>%
  get_selection()
#> [1] 4

# Traverse from node `5` to any inbound
# edges, and use multiple conditions with
# a single-length vector (here, using a
# `|` to create a set of `OR` conditions)
graph %>%
  select_nodes_by_id(5) %>%
  trav_in_edge(
    conditions = c(
      "rel %in% c('D', 'E') | values > 5.5")) %>%
  get_selection()
#> [1] 4 5

# Traverse from node `5` to any inbound
# edges, and use a regular expression as
# a filtering condition
graph %>%
  select_nodes_by_id(5) %>%
  trav_in_edge(
    conditions = "grepl('C|D', rel)") %>%
  get_selection()
#> [1] 4 5
# }

Run the code above in your browser using DataLab