From d5b8f34dd7ce82c9f63503c1b8e5b7eb917332a0 Mon Sep 17 00:00:00 2001 From: tonywu1999 Date: Thu, 16 Apr 2026 11:29:34 -0400 Subject: [PATCH 1/6] feat(deletion): Add code to delete an edge programmatically --- NAMESPACE | 1 + R/deleteEdgeFromNetwork.R | 40 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 R/deleteEdgeFromNetwork.R diff --git a/NAMESPACE b/NAMESPACE index 28f35aa..a202f76 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -2,6 +2,7 @@ export(annotateProteinInfoFromIndra) export(cytoscapeNetwork) +export(deleteEdgeFromNetwork) export(cytoscapeNetworkOutput) export(exportNetworkToHTML) export(filterSubnetworkByContext) diff --git a/R/deleteEdgeFromNetwork.R b/R/deleteEdgeFromNetwork.R new file mode 100644 index 0000000..3c28c97 --- /dev/null +++ b/R/deleteEdgeFromNetwork.R @@ -0,0 +1,40 @@ +#' Delete an edge from a network edges data frame +#' +#' Removes the row(s) from an edges data frame that match the given +#' \code{source}, \code{target}, and \code{interaction} values. This is +#' the programmatic counterpart of the interactive Ctrl+click / right-click +#' edge deletion available in \code{\link{cytoscapeNetwork}}. +#' +#' @param edges Data frame with at minimum columns \code{source}, +#' \code{target}, and \code{interaction}. +#' @param source Character. The source node identifier of the edge to +#' remove. +#' @param target Character. The target node identifier of the edge to +#' remove. +#' @param interaction Character. The interaction type of the edge to remove. +#' +#' @return The \code{edges} data frame with the matching row(s) removed. +#' +#' @examples +#' edges <- data.frame( +#' source = c("TP53", "MDM2", "CDKN1A"), +#' target = c("MDM2", "TP53", "TP53"), +#' interaction = c("Activation", "Inhibition", "Activation"), +#' stringsAsFactors = FALSE +#' ) +#' deleteEdgeFromNetwork(edges, "MDM2", "TP53", "Inhibition") +#' +#' @export +deleteEdgeFromNetwork <- function(edges, source, target, interaction) { + if (!is.data.frame(edges)) { + stop("`edges` must be a data frame.") + } + required_cols <- c("source", "target", "interaction") + if (!all(required_cols %in% names(edges))) { + stop("`edges` must contain columns: source, target, interaction.") + } + keep <- !(edges$source == source & + edges$target == target & + edges$interaction == interaction) + edges[keep, , drop = FALSE] +} From 75c147cf48f5e29733f1fe764ec17970e7f51bc7 Mon Sep 17 00:00:00 2001 From: tonywu1999 Date: Thu, 16 Apr 2026 11:42:29 -0400 Subject: [PATCH 2/6] add a vignette for a scrappy version of shiny network viewer --- vignettes/Interactive-Edge-Editor.Rmd | 282 ++++++++++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 vignettes/Interactive-Edge-Editor.Rmd diff --git a/vignettes/Interactive-Edge-Editor.Rmd b/vignettes/Interactive-Edge-Editor.Rmd new file mode 100644 index 0000000..741fa8d --- /dev/null +++ b/vignettes/Interactive-Edge-Editor.Rmd @@ -0,0 +1,282 @@ +--- +title: "Interactive Edge Editor (Minimal Shiny App)" +author: "Anthony Wu" +package: MSstatsBioNet +output: BiocStyle::html_document +vignette: > + %\VignetteIndexEntry{MSstatsBioNet: Interactive Edge Editor (Minimal Shiny App)} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +# Overview + +This vignette shows a self-contained Shiny app that lets you: + +1. Supply **nodes** and **edges** — either as built-in example data or by uploading + your own CSV files. +2. **Visualise** the network with `cytoscapeNetwork()`. +3. **Delete edges** interactively by Ctrl+clicking or right-clicking any edge. +4. **Download analysis code** — an R script that reproduces the curated network, + including a `deleteEdgeFromNetwork()` call for every edge you removed. + +The app requires only `shiny` and `MSstatsBioNet`; no INDRA API calls or MSstats +pipeline are involved. + +# CSV format + +If you choose to upload your own data the expected column layout is: + +| File | Required columns | Optional columns | +|------|-----------------|-----------------| +| Nodes CSV | `id` | `logFC`, `hgncName`, `Site` | +| Edges CSV | `source`, `target`, `interaction` | `site`, `evidenceLink` | + +# App code + +Copy the block below into an `.R` file and call `shinyApp(ui, server)` to launch, +or uncomment the last line and source the file directly. + +```{r eval = FALSE} +if (!requireNamespace("shiny", quietly = TRUE)) { + stop("Install the 'shiny' package to run this app.") +} + +library(shiny) +library(MSstatsBioNet) + +# ── Built-in example data ───────────────────────────────────────────────────── + +example_nodes <- data.frame( + id = c("TP53", "MDM2", "CDKN1A", "BCL2", "BAX", "CASP3"), + logFC = c( 1.8, -0.9, 2.1, -1.5, 1.2, 0.7), + stringsAsFactors = FALSE +) + +example_edges <- data.frame( + source = c("TP53", "TP53", "MDM2", + "TP53", "BCL2", "BAX"), + target = c("MDM2", "CDKN1A", "TP53", + "BAX", "BAX", "CASP3"), + interaction = c("Activation", "IncreaseAmount", "Inhibition", + "Activation", "Inhibition", "Activation"), + stringsAsFactors = FALSE +) + +# ── UI ──────────────────────────────────────────────────────────────────────── + +ui <- fluidPage( + titlePanel("Network Edge Editor"), + + sidebarLayout( + sidebarPanel( + width = 3, + + # Data source + radioButtons( + "data_source", "Data source", + choices = c("Example data" = "example", + "Upload CSV files" = "upload"), + selected = "example" + ), + conditionalPanel( + condition = "input.data_source == 'upload'", + fileInput("nodes_file", "Nodes CSV", accept = ".csv"), + tags$small( + "Required column: ", tags$code("id"), ". ", + "Optional: ", tags$code("logFC"), ", ", + tags$code("hgncName"), "." + ), + br(), + fileInput("edges_file", "Edges CSV", accept = ".csv"), + tags$small( + "Required columns: ", tags$code("source"), ", ", + tags$code("target"), ", ", tags$code("interaction"), "." + ) + ), + + hr(), + actionButton( + "show_network", "Display Network", + class = "btn-primary", width = "100%" + ), + + hr(), + tags$p( + tags$strong("To delete an edge:"), + " Ctrl+click or right-click it in the network." + ), + + # Live deletion log + uiOutput("deleted_summary"), + + hr(), + # Download button appears once network has been rendered + uiOutput("download_ui") + ), + + mainPanel( + width = 9, + cytoscapeNetworkOutput("network", height = "600px") + ) + ) +) + +# ── Server ──────────────────────────────────────────────────────────────────── + +server <- function(input, output, session) { + + # Accumulates edge info lists: list(source, target, interaction) + deleted_edges <- reactiveVal(list()) + + # ── Resolve input data ──────────────────────────────────────────────────── + + nodes_data <- reactive({ + if (input$data_source == "example") return(example_nodes) + req(input$nodes_file) + read.csv(input$nodes_file$datapath, stringsAsFactors = FALSE) + }) + + edges_data <- reactive({ + if (input$data_source == "example") return(example_edges) + req(input$edges_file) + read.csv(input$edges_file$datapath, stringsAsFactors = FALSE) + }) + + # ── Render network ──────────────────────────────────────────────────────── + + observeEvent(input$show_network, { + # Fresh render → reset the deletion log + deleted_edges(list()) + + output$network <- renderCytoscapeNetwork({ + cytoscapeNetwork(nodes = nodes_data(), edges = edges_data()) + }) + + # Reveal download button + output$download_ui <- renderUI({ + downloadButton("download_code", "Download analysis code") + }) + }) + + # ── Track deletions ─────────────────────────────────────────────────────── + + # The cytoscapeNetwork JS widget fires input$network_edge_deleted + # (with fields $source, $target, $interaction) on Ctrl+click / right-click. + observeEvent(input$network_edge_deleted, { + e <- input$network_edge_deleted + deleted_edges(c(deleted_edges(), list(e))) + }) + + # Live summary shown in the sidebar + output$deleted_summary <- renderUI({ + deleted <- deleted_edges() + if (length(deleted) == 0) return(NULL) + items <- lapply(deleted, function(e) { + tags$li(paste0(e$source, " \u2192 ", e$target, + " (", e$interaction, ")")) + }) + tagList( + tags$p(tags$strong(paste(length(deleted), "edge(s) deleted:"))), + tags$ul(items) + ) + }) + + # ── Download analysis code ──────────────────────────────────────────────── + + output$download_code <- downloadHandler( + filename = function() { + paste0("network-analysis-", Sys.Date(), ".R") + }, + content = function(file) { + # Capture the data frames as self-contained R expressions + nodes_expr <- paste( + capture.output(dput(isolate(nodes_data()))), + collapse = "\n" + ) + edges_expr <- paste( + capture.output(dput(isolate(edges_data()))), + collapse = "\n" + ) + + lines <- c( + "library(MSstatsBioNet)", + "", + "# Nodes", + paste0("nodes <- ", nodes_expr), + "", + "# Edges", + paste0("edges <- ", edges_expr), + "" + ) + + deleted <- isolate(deleted_edges()) + if (length(deleted) > 0) { + lines <- c(lines, "# Delete edges removed interactively") + for (e in deleted) { + lines <- c(lines, sprintf( + 'edges <- deleteEdgeFromNetwork(edges, "%s", "%s", "%s")', + e$source, e$target, e$interaction + )) + } + lines <- c(lines, "") + } + + lines <- c( + lines, + "# Visualise network", + "cytoscapeNetwork(nodes, edges)", + "", + "# Export to a standalone HTML file", + "exportNetworkToHTML(nodes, edges)" + ) + + writeLines(lines, file) + } + ) +} + +# shinyApp(ui, server) # uncomment to launch +``` + +# What the downloaded script looks like + +After displaying the network and deleting, say, the `MDM2 → TP53 (Inhibition)` and +`BCL2 → BAX (Inhibition)` edges, clicking **Download analysis code** produces an `.R` +file like this: + +```r +library(MSstatsBioNet) + +# Nodes +nodes <- structure(list(...), class = "data.frame") + +# Edges +edges <- structure(list(...), class = "data.frame") + +# Delete edges removed interactively +edges <- deleteEdgeFromNetwork(edges, "MDM2", "TP53", "Inhibition") +edges <- deleteEdgeFromNetwork(edges, "BCL2", "BAX", "Inhibition") + +# Visualise network +cytoscapeNetwork(nodes, edges) + +# Export to a standalone HTML file +exportNetworkToHTML(nodes, edges) +``` + +The script is fully self-contained: running it from top to bottom reproduces the +exact curated network without needing the Shiny app. + +# Session info + +```{r} +sessionInfo() +``` From 107e35c4fa0615db2c5af9d50df2b94a7c2c3a3e Mon Sep 17 00:00:00 2001 From: tonywu1999 Date: Thu, 16 Apr 2026 11:55:51 -0400 Subject: [PATCH 3/6] Revert "add a vignette for a scrappy version of shiny network viewer" This reverts commit 75c147cf48f5e29733f1fe764ec17970e7f51bc7. --- vignettes/Interactive-Edge-Editor.Rmd | 282 -------------------------- 1 file changed, 282 deletions(-) delete mode 100644 vignettes/Interactive-Edge-Editor.Rmd diff --git a/vignettes/Interactive-Edge-Editor.Rmd b/vignettes/Interactive-Edge-Editor.Rmd deleted file mode 100644 index 741fa8d..0000000 --- a/vignettes/Interactive-Edge-Editor.Rmd +++ /dev/null @@ -1,282 +0,0 @@ ---- -title: "Interactive Edge Editor (Minimal Shiny App)" -author: "Anthony Wu" -package: MSstatsBioNet -output: BiocStyle::html_document -vignette: > - %\VignetteIndexEntry{MSstatsBioNet: Interactive Edge Editor (Minimal Shiny App)} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` - -# Overview - -This vignette shows a self-contained Shiny app that lets you: - -1. Supply **nodes** and **edges** — either as built-in example data or by uploading - your own CSV files. -2. **Visualise** the network with `cytoscapeNetwork()`. -3. **Delete edges** interactively by Ctrl+clicking or right-clicking any edge. -4. **Download analysis code** — an R script that reproduces the curated network, - including a `deleteEdgeFromNetwork()` call for every edge you removed. - -The app requires only `shiny` and `MSstatsBioNet`; no INDRA API calls or MSstats -pipeline are involved. - -# CSV format - -If you choose to upload your own data the expected column layout is: - -| File | Required columns | Optional columns | -|------|-----------------|-----------------| -| Nodes CSV | `id` | `logFC`, `hgncName`, `Site` | -| Edges CSV | `source`, `target`, `interaction` | `site`, `evidenceLink` | - -# App code - -Copy the block below into an `.R` file and call `shinyApp(ui, server)` to launch, -or uncomment the last line and source the file directly. - -```{r eval = FALSE} -if (!requireNamespace("shiny", quietly = TRUE)) { - stop("Install the 'shiny' package to run this app.") -} - -library(shiny) -library(MSstatsBioNet) - -# ── Built-in example data ───────────────────────────────────────────────────── - -example_nodes <- data.frame( - id = c("TP53", "MDM2", "CDKN1A", "BCL2", "BAX", "CASP3"), - logFC = c( 1.8, -0.9, 2.1, -1.5, 1.2, 0.7), - stringsAsFactors = FALSE -) - -example_edges <- data.frame( - source = c("TP53", "TP53", "MDM2", - "TP53", "BCL2", "BAX"), - target = c("MDM2", "CDKN1A", "TP53", - "BAX", "BAX", "CASP3"), - interaction = c("Activation", "IncreaseAmount", "Inhibition", - "Activation", "Inhibition", "Activation"), - stringsAsFactors = FALSE -) - -# ── UI ──────────────────────────────────────────────────────────────────────── - -ui <- fluidPage( - titlePanel("Network Edge Editor"), - - sidebarLayout( - sidebarPanel( - width = 3, - - # Data source - radioButtons( - "data_source", "Data source", - choices = c("Example data" = "example", - "Upload CSV files" = "upload"), - selected = "example" - ), - conditionalPanel( - condition = "input.data_source == 'upload'", - fileInput("nodes_file", "Nodes CSV", accept = ".csv"), - tags$small( - "Required column: ", tags$code("id"), ". ", - "Optional: ", tags$code("logFC"), ", ", - tags$code("hgncName"), "." - ), - br(), - fileInput("edges_file", "Edges CSV", accept = ".csv"), - tags$small( - "Required columns: ", tags$code("source"), ", ", - tags$code("target"), ", ", tags$code("interaction"), "." - ) - ), - - hr(), - actionButton( - "show_network", "Display Network", - class = "btn-primary", width = "100%" - ), - - hr(), - tags$p( - tags$strong("To delete an edge:"), - " Ctrl+click or right-click it in the network." - ), - - # Live deletion log - uiOutput("deleted_summary"), - - hr(), - # Download button appears once network has been rendered - uiOutput("download_ui") - ), - - mainPanel( - width = 9, - cytoscapeNetworkOutput("network", height = "600px") - ) - ) -) - -# ── Server ──────────────────────────────────────────────────────────────────── - -server <- function(input, output, session) { - - # Accumulates edge info lists: list(source, target, interaction) - deleted_edges <- reactiveVal(list()) - - # ── Resolve input data ──────────────────────────────────────────────────── - - nodes_data <- reactive({ - if (input$data_source == "example") return(example_nodes) - req(input$nodes_file) - read.csv(input$nodes_file$datapath, stringsAsFactors = FALSE) - }) - - edges_data <- reactive({ - if (input$data_source == "example") return(example_edges) - req(input$edges_file) - read.csv(input$edges_file$datapath, stringsAsFactors = FALSE) - }) - - # ── Render network ──────────────────────────────────────────────────────── - - observeEvent(input$show_network, { - # Fresh render → reset the deletion log - deleted_edges(list()) - - output$network <- renderCytoscapeNetwork({ - cytoscapeNetwork(nodes = nodes_data(), edges = edges_data()) - }) - - # Reveal download button - output$download_ui <- renderUI({ - downloadButton("download_code", "Download analysis code") - }) - }) - - # ── Track deletions ─────────────────────────────────────────────────────── - - # The cytoscapeNetwork JS widget fires input$network_edge_deleted - # (with fields $source, $target, $interaction) on Ctrl+click / right-click. - observeEvent(input$network_edge_deleted, { - e <- input$network_edge_deleted - deleted_edges(c(deleted_edges(), list(e))) - }) - - # Live summary shown in the sidebar - output$deleted_summary <- renderUI({ - deleted <- deleted_edges() - if (length(deleted) == 0) return(NULL) - items <- lapply(deleted, function(e) { - tags$li(paste0(e$source, " \u2192 ", e$target, - " (", e$interaction, ")")) - }) - tagList( - tags$p(tags$strong(paste(length(deleted), "edge(s) deleted:"))), - tags$ul(items) - ) - }) - - # ── Download analysis code ──────────────────────────────────────────────── - - output$download_code <- downloadHandler( - filename = function() { - paste0("network-analysis-", Sys.Date(), ".R") - }, - content = function(file) { - # Capture the data frames as self-contained R expressions - nodes_expr <- paste( - capture.output(dput(isolate(nodes_data()))), - collapse = "\n" - ) - edges_expr <- paste( - capture.output(dput(isolate(edges_data()))), - collapse = "\n" - ) - - lines <- c( - "library(MSstatsBioNet)", - "", - "# Nodes", - paste0("nodes <- ", nodes_expr), - "", - "# Edges", - paste0("edges <- ", edges_expr), - "" - ) - - deleted <- isolate(deleted_edges()) - if (length(deleted) > 0) { - lines <- c(lines, "# Delete edges removed interactively") - for (e in deleted) { - lines <- c(lines, sprintf( - 'edges <- deleteEdgeFromNetwork(edges, "%s", "%s", "%s")', - e$source, e$target, e$interaction - )) - } - lines <- c(lines, "") - } - - lines <- c( - lines, - "# Visualise network", - "cytoscapeNetwork(nodes, edges)", - "", - "# Export to a standalone HTML file", - "exportNetworkToHTML(nodes, edges)" - ) - - writeLines(lines, file) - } - ) -} - -# shinyApp(ui, server) # uncomment to launch -``` - -# What the downloaded script looks like - -After displaying the network and deleting, say, the `MDM2 → TP53 (Inhibition)` and -`BCL2 → BAX (Inhibition)` edges, clicking **Download analysis code** produces an `.R` -file like this: - -```r -library(MSstatsBioNet) - -# Nodes -nodes <- structure(list(...), class = "data.frame") - -# Edges -edges <- structure(list(...), class = "data.frame") - -# Delete edges removed interactively -edges <- deleteEdgeFromNetwork(edges, "MDM2", "TP53", "Inhibition") -edges <- deleteEdgeFromNetwork(edges, "BCL2", "BAX", "Inhibition") - -# Visualise network -cytoscapeNetwork(nodes, edges) - -# Export to a standalone HTML file -exportNetworkToHTML(nodes, edges) -``` - -The script is fully self-contained: running it from top to bottom reproduces the -exact curated network without needing the Shiny app. - -# Session info - -```{r} -sessionInfo() -``` From 398b2dc0e94c596ac75ded64b23530acb558fe9d Mon Sep 17 00:00:00 2001 From: tonywu1999 Date: Thu, 16 Apr 2026 12:58:36 -0400 Subject: [PATCH 4/6] add edge deletion --- NAMESPACE | 2 +- man/deleteEdgeFromNetwork.Rd | 39 ++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 man/deleteEdgeFromNetwork.Rd diff --git a/NAMESPACE b/NAMESPACE index a202f76..82a8a32 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -2,8 +2,8 @@ export(annotateProteinInfoFromIndra) export(cytoscapeNetwork) -export(deleteEdgeFromNetwork) export(cytoscapeNetworkOutput) +export(deleteEdgeFromNetwork) export(exportNetworkToHTML) export(filterSubnetworkByContext) export(getSubnetworkFromIndra) diff --git a/man/deleteEdgeFromNetwork.Rd b/man/deleteEdgeFromNetwork.Rd new file mode 100644 index 0000000..5e0720f --- /dev/null +++ b/man/deleteEdgeFromNetwork.Rd @@ -0,0 +1,39 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/deleteEdgeFromNetwork.R +\name{deleteEdgeFromNetwork} +\alias{deleteEdgeFromNetwork} +\title{Delete an edge from a network edges data frame} +\usage{ +deleteEdgeFromNetwork(edges, source, target, interaction) +} +\arguments{ +\item{edges}{Data frame with at minimum columns \code{source}, +\code{target}, and \code{interaction}.} + +\item{source}{Character. The source node identifier of the edge to +remove.} + +\item{target}{Character. The target node identifier of the edge to +remove.} + +\item{interaction}{Character. The interaction type of the edge to remove.} +} +\value{ +The \code{edges} data frame with the matching row(s) removed. +} +\description{ +Removes the row(s) from an edges data frame that match the given +\code{source}, \code{target}, and \code{interaction} values. This is +the programmatic counterpart of the interactive Ctrl+click / right-click +edge deletion available in \code{\link{cytoscapeNetwork}}. +} +\examples{ +edges <- data.frame( + source = c("TP53", "MDM2", "CDKN1A"), + target = c("MDM2", "TP53", "TP53"), + interaction = c("Activation", "Inhibition", "Activation"), + stringsAsFactors = FALSE +) +deleteEdgeFromNetwork(edges, "MDM2", "TP53", "Inhibition") + +} From 1446b4cce38813e8a674f2e0231346e488061a65 Mon Sep 17 00:00:00 2001 From: tonywu1999 Date: Thu, 16 Apr 2026 13:29:14 -0400 Subject: [PATCH 5/6] Update R/deleteEdgeFromNetwork.R Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- R/deleteEdgeFromNetwork.R | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/R/deleteEdgeFromNetwork.R b/R/deleteEdgeFromNetwork.R index 3c28c97..b1b8783 100644 --- a/R/deleteEdgeFromNetwork.R +++ b/R/deleteEdgeFromNetwork.R @@ -29,12 +29,26 @@ deleteEdgeFromNetwork <- function(edges, source, target, interaction) { if (!is.data.frame(edges)) { stop("`edges` must be a data frame.") } + if (!is.character(source) || length(source) != 1L || is.na(source)) { + stop("`source` must be a single, non-NA character value.") + } + if (!is.character(target) || length(target) != 1L || is.na(target)) { + stop("`target` must be a single, non-NA character value.") + } + if (!is.character(interaction) || length(interaction) != 1L || is.na(interaction)) { + stop("`interaction` must be a single, non-NA character value.") + } required_cols <- c("source", "target", "interaction") if (!all(required_cols %in% names(edges))) { stop("`edges` must contain columns: source, target, interaction.") } - keep <- !(edges$source == source & - edges$target == target & - edges$interaction == interaction) + match_row <- !is.na(edges$source) & + !is.na(edges$target) & + !is.na(edges$interaction) & + edges$source == source & + edges$target == target & + edges$interaction == interaction + keep <- !match_row edges[keep, , drop = FALSE] } +} From 9d2832efa67744df66bca75b5ffb2ed90c523f00 Mon Sep 17 00:00:00 2001 From: tonywu1999 Date: Thu, 16 Apr 2026 13:37:43 -0400 Subject: [PATCH 6/6] fix formatting --- R/deleteEdgeFromNetwork.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/deleteEdgeFromNetwork.R b/R/deleteEdgeFromNetwork.R index b1b8783..37b1a3d 100644 --- a/R/deleteEdgeFromNetwork.R +++ b/R/deleteEdgeFromNetwork.R @@ -51,4 +51,4 @@ deleteEdgeFromNetwork <- function(edges, source, target, interaction) { keep <- !match_row edges[keep, , drop = FALSE] } -} +