Nothing
#' @rdname collapsibleTree
#' @method collapsibleTree Node
#' @export
collapsibleTree.Node <- function(df, hierarchy_attribute = "level",
root = df$name, inputId = NULL, attribute = "leafCount",
aggFun = sum, fill = "lightsteelblue",
linkLength = NULL, fontSize = 10, tooltip = FALSE,
tooltipHtml = NULL,nodeSize = NULL, collapsed = TRUE,
zoomable = TRUE, width = NULL, height = NULL, ...) {
# acceptable inherent node attributes
nodeAttr <- c("leafCount", "count")
# reject bad inputs
if(!is(df) %in% "Node") stop("df must be a data tree object")
if(!is.character(fill)) stop("fill must be a either a color or column name")
if(is.character(collapsed) & !(collapsed %in% c(df$attributes, nodeAttr))) stop("collapsed column name is incorrect")
if(!is.null(tooltipHtml)) if(!(tooltipHtml %in% df$attributes)) stop("tooltipHtml column name is incorrect")
if(!is.null(nodeSize)) if(!(nodeSize %in% c(df$attributes, nodeAttr))) stop("nodeSize column name is incorrect")
# calculate the right and left margins in pixels
leftMargin <- nchar(root)
rightLabelVector <- df$Get("name", filterFun = function(x) x$level==df$height)
rightMargin <- max(sapply(rightLabelVector, nchar))
# Deriving hierarchy variable from data.tree input
hierarchy <- unique(ToDataFrameTree(df, hierarchy_attribute)[[hierarchy_attribute]])
if(length(hierarchy) <= 1) stop("hierarchy vector must be greater than length 1")
# create a list that contains the options
options <- list(
hierarchy = hierarchy,
input = inputId,
attribute = attribute,
linkLength = linkLength,
fontSize = fontSize,
tooltip = tooltip,
collapsed = collapsed,
zoomable = zoomable,
margin = list(
top = 20,
bottom = 20,
left = (leftMargin * fontSize/2) + 25,
right = (rightMargin * fontSize/2) + 25
)
)
# these are the fields that will ultimately end up in the json
jsonFields <- NULL
if(fill %in% df$attributes) {
# fill in node colors based on column name
df$Do(function(x) x$fill <- x[[fill]])
jsonFields <- c(jsonFields, "fill")
} else {
# default to using fill value as literal color name
options$fill <- fill
}
# only necessary to perform these calculations if there is a tooltip
if(tooltip & is.null(tooltipHtml)) {
t <- data.tree::Traverse(df, hierarchy_attribute)
if(substitute(identity)=="identity") {
# for identity, leave the tooltips as is
data.tree::Do(t, function(x) {
x$WeightOfNode <- x[[attribute]]
})
} else {
# traverse down the tree and compute the weights of each node for the tooltip
data.tree::Do(t, function(x) {
x$WeightOfNode <- data.tree::Aggregate(x, attribute, aggFun)
# make the tooltips look nice
x$WeightOfNode <- prettyNum(
x$WeightOfNode, big.mark = ",", digits = 3, scientific = FALSE
)
})
}
jsonFields <- c(jsonFields, "WeightOfNode")
}
# if tooltipHtml is specified, pass it on in the data
if(tooltip & !is.null(tooltipHtml)) {
df$Do(function(x) x$tooltip <- x[[tooltipHtml]])
jsonFields <- c(jsonFields, "tooltip")
}
# if collapsed is specified, pass it on in the data
if(is.character(collapsed)) jsonFields <- c(jsonFields, collapsed)
# only necessary to perform these calculations if there is a nodeSize specified
if(!is.null(nodeSize)) {
# Scale factor to keep the median leaf size around 10
scaleFactor <- 10/data.tree::Aggregate(df, nodeSize, stats::median)
t <- data.tree::Traverse(df, hierarchy_attribute)
# traverse down the tree and compute the size of each node
data.tree::Do(t, function(x) {
x$SizeOfNode <- data.tree::Aggregate(x, nodeSize, aggFun)
# scale node growth to area rather than radius and round
x$SizeOfNode <- round(sqrt(x$SizeOfNode*scaleFactor)*pi, 2)
})
# update left margin based on new root size
options$margin$left <- options$margin$left + df$SizeOfNode - 10
jsonFields <- c(jsonFields, "SizeOfNode")
}
# keep only the JSON fields that are necessary
if(is.null(jsonFields)) jsonFields <- NA
data <- data.tree::ToListExplicit(df, unname = TRUE, keepOnly = jsonFields)
# pass the data and options using 'x'
x <- list(
data = data,
options = options
)
# create the widget
htmlwidgets::createWidget(
"collapsibleTree", x, width = width, height = height,
htmlwidgets::sizingPolicy(viewer.padding = 0)
)
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.