The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Network Pharmacology Workflow

library(unitcm)
library(dplyr)

This vignette demonstrates a complete network pharmacology workflow: from a TCM formula to its herb-compound-target (H-C-T) network.

Step 1: Select a Formula

Start by searching for a formula related to a disease of interest:

formulas <- search_formulas(q = "insomnia", page_size = 5)
formulas

# Get full details for the first formula
formula <- get_formula(formulas$order[1])
formula$formula_name
formula$composition

Step 2: Get Herb Composition

doses <- get_formula_doses(formulas$order[1])
doses

# Extract herb names
herb_names <- doses$herb_name
herb_names

Step 3: Find Herb IDs

Search for each herb to get its UniTCM ID:

herb_data <- lapply(herb_names, function(name) {
  result <- search_herbs(q = name, page_size = 1)
  if (nrow(result) > 0) result[1, ]
})
herb_data <- bind_rows(herb_data)
herb_data

Step 4: Get Compounds for Each Herb

all_compounds <- lapply(herb_data$unitcm_herb_id, function(hid) {
  comps <- get_herb_compounds(hid, all_pages = TRUE)
  if (nrow(comps) > 0) comps$herb_id <- hid
  comps
})
all_compounds <- bind_rows(all_compounds)

# Unique compounds
unique_compounds <- distinct(all_compounds, unitcm_ingredient_id,
                             .keep_all = TRUE)
cat(nrow(unique_compounds), "unique compounds found\n")

Step 5: Get Targets for Key Compounds

# Get targets for top compounds (limit to first 10 for speed)
top_compounds <- head(unique_compounds, 10)

all_targets <- lapply(top_compounds$unitcm_ingredient_id, function(cid) {
  targets <- get_compound_targets(cid, method = "drugclip")
  if (nrow(targets) > 0) targets$compound_id <- cid
  targets
})
all_targets <- bind_rows(all_targets)
cat(length(unique(all_targets$gene_symbol)), "unique targets found\n")

Step 6: Build Network with igraph

library(igraph)

# Herb-Compound edges
hc_edges <- all_compounds |>
  select(from = herb_id, to = unitcm_ingredient_id) |>
  distinct()

# Compound-Target edges
ct_edges <- all_targets |>
  select(from = compound_id, to = gene_symbol) |>
  distinct()

# Combine edges
edges <- bind_rows(hc_edges, ct_edges)

# Build graph
g <- graph_from_data_frame(edges, directed = FALSE)

# Add node type attribute
V(g)$type <- case_when(
  V(g)$name %in% herb_data$unitcm_herb_id ~ "herb",
  V(g)$name %in% unique_compounds$unitcm_ingredient_id ~ "compound",
  TRUE ~ "target"
)

cat("Network:", vcount(g), "nodes,", ecount(g), "edges\n")

Step 7: Visualize with ggraph

library(ggraph)

ggraph(g, layout = "fr") +
  geom_edge_link(alpha = 0.3) +
  geom_node_point(aes(color = type, size = type)) +
  scale_color_manual(values = c(herb = "#e74c3c", compound = "#3498db",
                                target = "#2ecc71")) +
  scale_size_manual(values = c(herb = 6, compound = 3, target = 2)) +
  geom_node_text(
    aes(label = ifelse(type == "herb", name, "")),
    repel = TRUE, size = 3
  ) +
  theme_void() +
  labs(title = paste("H-C-T Network:", formula$formula_name))

Step 8: Pathway Enrichment via MIDAS

Use the identified targets for disease enrichment analysis:

target_genes <- unique(all_targets$gene_symbol)
enrichment <- query_disease_enrichment(
  target_genes,
  p_value_cutoff = 0.05,
  correction_method = "fdr"
)
head(enrichment, 10)

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.