diff --git a/R/measure_features.R b/R/measure_features.R index 608d6fc..b570b3e 100644 --- a/R/measure_features.R +++ b/R/measure_features.R @@ -150,6 +150,7 @@ net_by_richclub <- function(.data){ net_by_factions <- function(.data, membership = NULL){ .data <- manynet::expect_nodes(.data) + membership <- .resolve_membership(.data, membership) if(is.null(membership)){ manynet::snet_info("No membership vector assigned.", "Partitioning the network using {.fn node_in_partition}.") @@ -207,6 +208,7 @@ net_by_modularity <- function(.data, membership = NULL, resolution = 1){ .data <- manynet::expect_nodes(.data) + membership <- .resolve_membership(.data, membership) if(is.null(membership)){ manynet::snet_info("Since no membership argument has been provided,", "a partition of the network into two will be calculated and used.") diff --git a/R/motif_brokerage.R b/R/motif_brokerage.R index 7588b9a..8813b1f 100644 --- a/R/motif_brokerage.R +++ b/R/motif_brokerage.R @@ -33,15 +33,16 @@ NULL node_x_brokerage <- function(.data, membership, standardized = FALSE){ thisRequires("sna") .data <- manynet::expect_nodes(.data) + membership <- .resolve_membership(.data, membership) if(!manynet::is_twomode(.data)){ out <- sna::brokerage(manynet::as_network(.data), - manynet::node_attribute(.data, membership)) + membership) out <- if(standardized) out$z.nli else out$raw.nli colnames(out) <- c("Coordinator", "Itinerant", "Gatekeeper", "Representative", "Liaison", "Total") } else { out <- suppressWarnings(sna::brokerage(manynet::as_network(manynet::to_mode1(.data)), - manynet::node_attribute(.data, membership))) + membership)) out <- if(standardized) out$z.nli else out$raw.nli out <- out[,-4] colnames(out) <- c("Coordinator", "Itinerant", "Gatekeeper", @@ -72,15 +73,16 @@ NULL net_x_brokerage <- function(.data, membership, standardized = FALSE){ thisRequires("sna") .data <- manynet::expect_nodes(.data) + membership <- .resolve_membership(.data, membership) if(!manynet::is_twomode(.data)){ out <- sna::brokerage(manynet::as_network(.data), - manynet::node_attribute(.data, membership)) + membership) out <- if(standardized) out$z.gli else out$raw.gli names(out) <- c("Coordinator", "Itinerant", "Gatekeeper", "Representative", "Liaison", "Total") } else { out <- suppressWarnings(sna::brokerage(manynet::as_network(manynet::to_mode1(.data)), - manynet::node_attribute(.data, membership))) + membership)) out <- if(standardized) out$z.gli else out$raw.gli names(out) <- c("Coordinator", "Itinerant", "Gatekeeper", "Representative", "Liaison", "Total") @@ -118,10 +120,11 @@ node_by_brokering_activity <- function(.data, membership){ .data <- manynet::expect_nodes(.data) twopaths <- .to_twopaths(.data) if(!missing(membership)){ - twopaths$from_memb <- manynet::node_attribute(.data, membership)[`if`(manynet::is_labelled(.data), + membership <- .resolve_membership(.data, membership) + twopaths$from_memb <- membership[`if`(manynet::is_labelled(.data), match(twopaths$from, manynet::node_names(.data)), twopaths$from)] - twopaths$to_memb <- manynet::node_attribute(.data, membership)[`if`(manynet::is_labelled(.data), + twopaths$to_memb <- membership[`if`(manynet::is_labelled(.data), match(twopaths$to.y, manynet::node_names(.data)), twopaths$to.y)] twopaths <- dplyr::filter(twopaths, from_memb != to_memb) @@ -147,10 +150,11 @@ node_by_brokering_exclusivity <- function(.data, membership){ .data <- manynet::expect_nodes(.data) twopaths <- .to_twopaths(.data) if(!missing(membership)){ - twopaths$from_memb <- manynet::node_attribute(.data, membership)[`if`(manynet::is_labelled(.data), + membership <- .resolve_membership(.data, membership) + twopaths$from_memb <- membership[`if`(manynet::is_labelled(.data), match(twopaths$from, manynet::node_names(.data)), twopaths$from)] - twopaths$to_memb <- manynet::node_attribute(.data, membership)[`if`(manynet::is_labelled(.data), + twopaths$to_memb <- membership[`if`(manynet::is_labelled(.data), match(twopaths$to.y, manynet::node_names(.data)), twopaths$to.y)] twopaths <- dplyr::filter(twopaths, from_memb != to_memb) diff --git a/R/netrics-utils.R b/R/netrics-utils.R index a97ab23..55057ff 100644 --- a/R/netrics-utils.R +++ b/R/netrics-utils.R @@ -40,4 +40,16 @@ seq_nodes <- function(.data){ seq.int(manynet::net_nodes(.data)) } +# Resolve membership to a vector: +# if a single character string naming a network attribute is provided, +# retrieve that attribute as a vector; otherwise return the value as-is. +.resolve_membership <- function(.data, membership) { + if (is.character(membership) && length(membership) == 1 && + membership %in% manynet::node_attribute_names(.data)) { + manynet::node_attribute(.data, membership) + } else { + membership + } +} + # nocov end \ No newline at end of file diff --git a/man-roxygen/param_memb.R b/man-roxygen/param_memb.R index 991f2d7..37f307c 100644 --- a/man-roxygen/param_memb.R +++ b/man-roxygen/param_memb.R @@ -1,5 +1,6 @@ -#' @param membership A character vector of categorical membership. -#' This is a vector of the same length as the number of nodes in the network, -#' where each element is a character string indicating the membership of the corresponding node. -#' While this may often be a vector created using `node_in_*()` functions, +#' @param membership A character string naming an existing node attribute in +#' the network, or a categorical vector of the same length as the number of +#' nodes in the network where each element indicates the group membership of +#' the corresponding node. +#' While this may often be a vector created using `node_in_*()` functions, #' it can be any character vector that assigns nodes to groups or categories.