Draw a tree using box drawing characters. Unicode characters are used if available. (Set the cli.unicode option if auto-detection fails.)

tree(
  data,
  root = data[[1]][[1]],
  style = NULL,
  width = console_width(),
  trim = FALSE
)

Arguments

data

Data frame that contains the tree structure. The first column is an id, and the second column is a list column, that contains the ids of the child nodes. The optional third column may contain the text to print to annotate the node.

root

The name of the root node.

style

Optional box style list.

width

Maximum width of the output. Defaults to the width option, see base::options().

trim

Whether to avoid traversing the same nodes multiple times. If TRUE and data has a trimmed column, then that is used for printing repeated noded.

Value

Character vector, the lines of the tree drawing.

Details

A node might appear multiple times in the tree, or might not appear at all.

Examples

data <- data.frame( stringsAsFactors = FALSE, package = c("processx", "backports", "assertthat", "Matrix", "magrittr", "rprojroot", "clisymbols", "prettyunits", "withr", "desc", "igraph", "R6", "crayon", "debugme", "digest", "irlba", "rcmdcheck", "callr", "pkgconfig", "lattice"), dependencies = I(list( c("assertthat", "crayon", "debugme", "R6"), character(0), character(0), "lattice", character(0), "backports", character(0), c("magrittr", "assertthat"), character(0), c("assertthat", "R6", "crayon", "rprojroot"), c("irlba", "magrittr", "Matrix", "pkgconfig"), character(0), character(0), "crayon", character(0), "Matrix", c("callr", "clisymbols", "crayon", "desc", "digest", "prettyunits", "R6", "rprojroot", "withr"), c("processx", "R6"), character(0), character(0) )) ) tree(data)
#> processx #> ├─assertthat #> ├─crayon #> ├─debugme #> │ └─crayon #> └─R6
tree(data, root = "rcmdcheck")
#> rcmdcheck #> ├─callr #> │ ├─processx #> │ │ ├─assertthat #> │ │ ├─crayon #> │ │ ├─debugme #> │ │ │ └─crayon #> │ │ └─R6 #> │ └─R6 #> ├─clisymbols #> ├─crayon #> ├─desc #> │ ├─assertthat #> │ ├─R6 #> │ ├─crayon #> │ └─rprojroot #> │ └─backports #> ├─digest #> ├─prettyunits #> │ ├─magrittr #> │ └─assertthat #> ├─R6 #> ├─rprojroot #> │ └─backports #> └─withr
# Colored nodes data$label <- paste(data$package, style_dim(paste0("(", c("2.0.0.1", "1.1.1", "0.2.0", "1.2-11", "1.5", "1.2", "1.2.0", "1.0.2", "2.0.0", "1.1.1.9000", "1.1.2", "2.2.2", "1.3.4", "1.0.2", "0.6.12", "2.2.1", "1.2.1.9002", "1.0.0.9000", "2.0.1", "0.20-35"), ")")) ) roots <- ! data$package %in% unlist(data$dependencies) data$label[roots] <- col_cyan(style_italic(data$label[roots])) tree(data)
#> processx (2.0.0.1) #> ├─assertthat (0.2.0) #> ├─crayon (1.3.4) #> ├─debugme (1.0.2) #> │ └─crayon (1.3.4) #> └─R6 (2.2.2)
tree(data, root = "rcmdcheck")
#> rcmdcheck (1.2.1.9002) #> ├─callr (1.0.0.9000) #> │ ├─processx (2.0.0.1) #> │ │ ├─assertthat (0.2.0) #> │ │ ├─crayon (1.3.4) #> │ │ ├─debugme (1.0.2) #> │ │ │ └─crayon (1.3.4) #> │ │ └─R6 (2.2.2) #> │ └─R6 (2.2.2) #> ├─clisymbols (1.2.0) #> ├─crayon (1.3.4) #> ├─desc (1.1.1.9000) #> │ ├─assertthat (0.2.0) #> │ ├─R6 (2.2.2) #> │ ├─crayon (1.3.4) #> │ └─rprojroot (1.2) #> │ └─backports (1.1.1) #> ├─digest (0.6.12) #> ├─prettyunits (1.0.2) #> │ ├─magrittr (1.5) #> │ └─assertthat (0.2.0) #> ├─R6 (2.2.2) #> ├─rprojroot (1.2) #> │ └─backports (1.1.1) #> └─withr (2.0.0)
# Trimming pkgdeps <- list( "dplyr@0.8.3" = c("assertthat@0.2.1", "glue@1.3.1", "magrittr@1.5", "R6@2.4.0", "Rcpp@1.0.2", "rlang@0.4.0", "tibble@2.1.3", "tidyselect@0.2.5"), "assertthat@0.2.1" = character(), "glue@1.3.1" = character(), "magrittr@1.5" = character(), "pkgconfig@2.0.3" = character(), "R6@2.4.0" = character(), "Rcpp@1.0.2" = character(), "rlang@0.4.0" = character(), "tibble@2.1.3" = c("cli@1.1.0", "crayon@1.3.4", "fansi@0.4.0", "pillar@1.4.2", "pkgconfig@2.0.3", "rlang@0.4.0"), "cli@1.1.0" = c("assertthat@0.2.1", "crayon@1.3.4"), "crayon@1.3.4" = character(), "fansi@0.4.0" = character(), "pillar@1.4.2" = c("cli@1.1.0", "crayon@1.3.4", "fansi@0.4.0", "rlang@0.4.0", "utf8@1.1.4", "vctrs@0.2.0"), "utf8@1.1.4" = character(), "vctrs@0.2.0" = c("backports@1.1.5", "ellipsis@0.3.0", "digest@0.6.21", "glue@1.3.1", "rlang@0.4.0", "zeallot@0.1.0"), "backports@1.1.5" = character(), "ellipsis@0.3.0" = c("rlang@0.4.0"), "digest@0.6.21" = character(), "glue@1.3.1" = character(), "zeallot@0.1.0" = character(), "tidyselect@0.2.5" = c("glue@1.3.1", "purrr@1.3.1", "rlang@0.4.0", "Rcpp@1.0.2"), "purrr@0.3.3" = c("magrittr@1.5", "rlang@0.4.0") ) pkgs <- data.frame( stringsAsFactors = FALSE, name = names(pkgdeps), deps = I(unname(pkgdeps)) ) tree(pkgs)
#> dplyr@0.8.3 #> ├─assertthat@0.2.1 #> ├─glue@1.3.1 #> ├─magrittr@1.5 #> ├─R6@2.4.0 #> ├─Rcpp@1.0.2 #> ├─rlang@0.4.0 #> ├─tibble@2.1.3 #> │ ├─cli@1.1.0 #> │ │ ├─assertthat@0.2.1 #> │ │ └─crayon@1.3.4 #> │ ├─crayon@1.3.4 #> │ ├─fansi@0.4.0 #> │ ├─pillar@1.4.2 #> │ │ ├─cli@1.1.0 #> │ │ │ ├─assertthat@0.2.1 #> │ │ │ └─crayon@1.3.4 #> │ │ ├─crayon@1.3.4 #> │ │ ├─fansi@0.4.0 #> │ │ ├─rlang@0.4.0 #> │ │ ├─utf8@1.1.4 #> │ │ └─vctrs@0.2.0 #> │ │ ├─backports@1.1.5 #> │ │ ├─ellipsis@0.3.0 #> │ │ │ └─rlang@0.4.0 #> │ │ ├─digest@0.6.21 #> │ │ ├─glue@1.3.1 #> │ │ ├─rlang@0.4.0 #> │ │ └─zeallot@0.1.0 #> │ ├─pkgconfig@2.0.3 #> │ └─rlang@0.4.0 #> └─tidyselect@0.2.5 #> ├─glue@1.3.1 #> ├─rlang@0.4.0 #> └─Rcpp@1.0.2
tree(pkgs, trim = TRUE)
#> dplyr@0.8.3 #> ├─assertthat@0.2.1 #> ├─glue@1.3.1 #> ├─magrittr@1.5 #> ├─R6@2.4.0 #> ├─Rcpp@1.0.2 #> ├─rlang@0.4.0 #> ├─tibble@2.1.3 #> │ ├─cli@1.1.0 #> │ │ ├─assertthat@0.2.1 #> │ │ └─crayon@1.3.4 #> │ ├─crayon@1.3.4 #> │ ├─fansi@0.4.0 #> │ ├─pillar@1.4.2 #> │ │ ├─cli@1.1.0 #> │ │ ├─crayon@1.3.4 #> │ │ ├─fansi@0.4.0 #> │ │ ├─rlang@0.4.0 #> │ │ ├─utf8@1.1.4 #> │ │ └─vctrs@0.2.0 #> │ │ ├─backports@1.1.5 #> │ │ ├─ellipsis@0.3.0 #> │ │ │ └─rlang@0.4.0 #> │ │ ├─digest@0.6.21 #> │ │ ├─glue@1.3.1 #> │ │ ├─rlang@0.4.0 #> │ │ └─zeallot@0.1.0 #> │ ├─pkgconfig@2.0.3 #> │ └─rlang@0.4.0 #> └─tidyselect@0.2.5 #> ├─glue@1.3.1 #> ├─rlang@0.4.0 #> └─Rcpp@1.0.2
# Mark the trimmed nodes pkgs$label <- pkgs$name pkgs$trimmed <- paste(pkgs$name, " (trimmed)") tree(pkgs, trim = TRUE)
#> dplyr@0.8.3 #> ├─assertthat@0.2.1 #> ├─glue@1.3.1 #> ├─magrittr@1.5 #> ├─R6@2.4.0 #> ├─Rcpp@1.0.2 #> ├─rlang@0.4.0 #> ├─tibble@2.1.3 #> │ ├─cli@1.1.0 #> │ │ ├─assertthat@0.2.1 (trimmed) #> │ │ └─crayon@1.3.4 #> │ ├─crayon@1.3.4 (trimmed) #> │ ├─fansi@0.4.0 #> │ ├─pillar@1.4.2 #> │ │ ├─cli@1.1.0 (trimmed) #> │ │ ├─crayon@1.3.4 (trimmed) #> │ │ ├─fansi@0.4.0 (trimmed) #> │ │ ├─rlang@0.4.0 (trimmed) #> │ │ ├─utf8@1.1.4 #> │ │ └─vctrs@0.2.0 #> │ │ ├─backports@1.1.5 #> │ │ ├─ellipsis@0.3.0 #> │ │ │ └─rlang@0.4.0 (trimmed) #> │ │ ├─digest@0.6.21 #> │ │ ├─glue@1.3.1 (trimmed) #> │ │ ├─rlang@0.4.0 (trimmed) #> │ │ └─zeallot@0.1.0 #> │ ├─pkgconfig@2.0.3 #> │ └─rlang@0.4.0 (trimmed) #> └─tidyselect@0.2.5 #> ├─glue@1.3.1 (trimmed) #> ├─rlang@0.4.0 (trimmed) #> └─Rcpp@1.0.2 (trimmed)