Add Compound proteinIdType and entity-agnostic grounding for metabolite networks#105
Conversation
Generalize the protein-only HgncId/HgncName contract into EntityNamespace/EntityId/EntityName grounded through Gilda, keeping multi-grounding as semicolon-joined aligned lists that fan out into the INDRA query. Gene-only annotations are skipped for compounds, and the new contract flows through annotateProteinInfoFromIndra, getSubnetworkFromIndra, and cytoscapeNetwork.
📝 WalkthroughWalkthroughThe PR replaces HGNC-specific identifier columns ( ChangesUnified Entity Grounding Refactor
Sequence Diagram(s)sequenceDiagram
participant User
participant annotateProteinInfoFromIndra
participant populateEntityInformationInDataFrame
participant IndraCogex as INDRA Cogex API
participant GildaAPI as Gilda ground_multi API
participant getSubnetworkFromIndra
participant buildCogexGroundings
participant IndraCogexSubnet as INDRA Cogex Subnetwork API
User->>annotateProteinInfoFromIndra: df, proteinIdType
annotateProteinInfoFromIndra->>populateEntityInformationInDataFrame: dispatch by proteinIdType
alt Uniprot / Uniprot_Mnemonic
populateEntityInformationInDataFrame->>IndraCogex: UniprotId → HGNC id/name
IndraCogex-->>populateEntityInformationInDataFrame: EntityNamespace=HGNC, EntityId, EntityName
else Hgnc_Name
populateEntityInformationInDataFrame->>GildaAPI: ground_multi(keep_only=HGNC)
GildaAPI-->>populateEntityInformationInDataFrame: ns/id/name vectors (semicolon-joined if multi)
else Metabolite
populateEntityInformationInDataFrame->>GildaAPI: ground_multi(no filter)
GildaAPI-->>populateEntityInformationInDataFrame: ns/id/name vectors (CHEBI etc.)
end
annotateProteinInfoFromIndra-->>User: df with EntityNamespace, EntityId, EntityName
User->>getSubnetworkFromIndra: annotated df (EntityNamespace, EntityId)
getSubnetworkFromIndra->>buildCogexGroundings: namespaces, ids (semicolon-split fan-out)
buildCogexGroundings-->>getSubnetworkFromIndra: INDRA node groundings list
getSubnetworkFromIndra->>IndraCogexSubnet: POST with groundings
IndraCogexSubnet-->>getSubnetworkFromIndra: edges + node metadata
getSubnetworkFromIndra-->>User: subnetwork with entityName/entityId nodes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested labels
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## devel #105 +/- ##
==========================================
+ Coverage 75.35% 77.17% +1.81%
==========================================
Files 9 9
Lines 1047 1139 +92
==========================================
+ Hits 789 879 +90
- Misses 258 260 +2 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
@coderabbitai review |
✅ Action performedReview finished.
|
| # `emitted_cpds` and `node_type = "compound"` below refer to Cytoscape | ||
| # grouping containers used to parent PTM satellite nodes around a protein. | ||
| # This Cytoscape "compound" concept is UNRELATED to the chemical | ||
| # `proteinIdType = "Compound"` analyte type in annotateProteinInfoFromIndra. |
There was a problem hiding this comment.
For now, let's use metabolite instead of compound as an enum for proteinIdType. Could you make this change? And then this comment could get removed.
…d gene identifiers; update documentation; remove deprecated functions
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
R/utils_annotateProteinInfoFromIndra.R (1)
304-315:⚠️ Potential issue | 🟠 MajorGuard non-2xx Gilda responses before iterating parsed content.
If Gilda returns an error response (4xx/5xx), the current code still parses it and enters the loop at line 323, where it can fail accessing
entry$termon malformed structures. Add an HTTP status check before processing the parsed response.Suggested fix
res <- tryCatch({ response <- POST( apiUrl, body = requestBody, add_headers("Content-Type" = "application/json"), encode = "raw" ) - content(response) + if (httr::http_error(response)) { + message("Gilda API returned HTTP ", httr::status_code(response)) + return(NULL) + } + parsed <- content(response, as = "parsed", simplifyVector = FALSE) + if (!is.list(parsed)) { + message("Unexpected Gilda API response shape.") + return(NULL) + } + parsed }, error = function(e) { message("Error in API call: ", e) NULL })Remember to add
http_errorandstatus_codeto the@importFrom httrstatement.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@R/utils_annotateProteinInfoFromIndra.R` around lines 304 - 315, The tryCatch block in the code currently parses Gilda API responses without validating the HTTP status code, allowing error responses (4xx/5xx) to be processed and passed to the iteration loop that accesses entry$term. Add an HTTP status check using status_code() function after the POST call but before calling content(response), such that if the status code indicates an error, the function returns NULL instead of attempting to parse and process the malformed response. Additionally, update the `@importFrom` httr statement to include both http_error and status_code functions.R/utils_getSubnetworkFromIndra.R (1)
93-108:⚠️ Potential issue | 🟠 MajorAdd timeout and HTTP status handling to the Cogex API call.
POST()is currently executed without a timeout, andcontent()is consumed without checking response status. A transient network issue or 5xx response can hang or propagate unclear parse failures.Suggested fix
- res <- POST( + res <- POST( indraCogexUrl, body = groundings, add_headers("Content-Type" = "application/json"), + httr::timeout(30), encode = "raw" ) - res <- content(res) + httr::stop_for_status(res) + res <- content(res)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@R/utils_getSubnetworkFromIndra.R` around lines 93 - 108, The `.callIndraCogexApi` function makes a POST request without a timeout and consumes the response without checking the HTTP status code, which can cause hangs on network issues or unclear failures on server errors. Add a timeout parameter to the POST() call (such as using the timeout() function from httr) and check the response status code using status_code() before calling content(). If the status code indicates an error (not in the 2xx range), stop execution with a meaningful error message that includes both the status code and response content.
🧹 Nitpick comments (2)
tests/testthat/test-utils_annotateProteinInfoFromIndra.R.R (1)
98-106: ⚡ Quick winMocking the function under test makes this assertion tautological.
Because
.callGroundEntitiesFromGildaApiis replaced directly, the test does not validate request construction/filtering/parsing behavior. Mock lower-level HTTP boundaries instead so the function body executes.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/testthat/test-utils_annotateProteinInfoFromIndra.R.R` around lines 98 - 106, The test mocks `.callGroundEntitiesFromGildaApi` directly, which prevents the actual function body from executing and makes the test unable to validate real request construction, filtering, and parsing behavior. Instead of mocking the function under test itself, mock the lower-level HTTP boundaries or API calls that `.callGroundEntitiesFromGildaApi` uses internally. This allows the function to execute its actual logic while controlling external dependencies, enabling the test to properly validate the function's behavior.tests/testthat/test-getSubnetworkFromIndra.R (1)
5-7: ⚡ Quick winAssert forwarded
ns/idsin the Cogex mock to lock in this contract.The new signature is mocked but not asserted. Capturing and checking
ns/idsvalues would make this test fail on any future regression that accidentally reverts to old identifiers.Also applies to: 17-19
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/testthat/test-getSubnetworkFromIndra.R` around lines 5 - 7, The mocked `callIndraCogexApi` function needs to include assertions that verify the `ns` and `ids` parameters are receiving the expected values before returning the mocked response. Add assertions within the mock function body to validate these parameter values match what is expected in the new signature. This pattern should be applied consistently across all similar mocked function definitions that have been updated with the new signature to ensure any future regressions are caught.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@R/annotateProteinInfoFromIndra.R`:
- Around line 64-67: The validation logic for proteinIdType does not explicitly
handle NA values, causing the condition at the validation check (where allowed
values are compared) to trigger a generic runtime error instead of the intended
validation message. Add an explicit NA check to the validation condition before
or alongside the existing length and membership checks (the `if` statement
containing the `!proteinIdType %in% allowed` test) so that NA values are caught
and produce the proper validation error message.
In `@R/utils_getSubnetworkFromIndra.R`:
- Around line 10-12: The validation check in the conditional statement that
starts at line 10 only verifies the presence of EntityId and EntityNamespace
columns, but downstream code unconditionally accesses additional columns:
Protein, adj.pvalue, log2FC, and EntityName. Expand the validation to check for
all required columns (EntityId, EntityNamespace, Protein, adj.pvalue, log2FC,
and EntityName) in a single comprehensive check, and update the error message to
clearly indicate all required column names so users receive an explicit
input-contract error rather than opaque subsetting errors later.
In `@tests/testthat/test-utils_annotateProteinInfoFromIndra.R.R`:
- Around line 79-94: The test function testing .callGroundEntitiesFromGildaApi
makes unconditional live API calls to an external service, which can fail
unpredictably in CI environments. Wrap the test logic with a conditional check
using skip_if to gate the test behind an opt-in environment variable (for
example, check if a flag like RUN_LIVE_TESTS is set), allowing the test to be
skipped by default in CI but runnable manually when the environment variable is
set. Alternatively, refactor the test to mock the API responses instead of
making actual API calls while maintaining the same validation logic for the
returned data structure and content.
---
Outside diff comments:
In `@R/utils_annotateProteinInfoFromIndra.R`:
- Around line 304-315: The tryCatch block in the code currently parses Gilda API
responses without validating the HTTP status code, allowing error responses
(4xx/5xx) to be processed and passed to the iteration loop that accesses
entry$term. Add an HTTP status check using status_code() function after the POST
call but before calling content(response), such that if the status code
indicates an error, the function returns NULL instead of attempting to parse and
process the malformed response. Additionally, update the `@importFrom` httr
statement to include both http_error and status_code functions.
In `@R/utils_getSubnetworkFromIndra.R`:
- Around line 93-108: The `.callIndraCogexApi` function makes a POST request
without a timeout and consumes the response without checking the HTTP status
code, which can cause hangs on network issues or unclear failures on server
errors. Add a timeout parameter to the POST() call (such as using the timeout()
function from httr) and check the response status code using status_code()
before calling content(). If the status code indicates an error (not in the 2xx
range), stop execution with a meaningful error message that includes both the
status code and response content.
---
Nitpick comments:
In `@tests/testthat/test-getSubnetworkFromIndra.R`:
- Around line 5-7: The mocked `callIndraCogexApi` function needs to include
assertions that verify the `ns` and `ids` parameters are receiving the expected
values before returning the mocked response. Add assertions within the mock
function body to validate these parameter values match what is expected in the
new signature. This pattern should be applied consistently across all similar
mocked function definitions that have been updated with the new signature to
ensure any future regressions are caught.
In `@tests/testthat/test-utils_annotateProteinInfoFromIndra.R.R`:
- Around line 98-106: The test mocks `.callGroundEntitiesFromGildaApi` directly,
which prevents the actual function body from executing and makes the test unable
to validate real request construction, filtering, and parsing behavior. Instead
of mocking the function under test itself, mock the lower-level HTTP boundaries
or API calls that `.callGroundEntitiesFromGildaApi` uses internally. This allows
the function to execute its actual logic while controlling external
dependencies, enabling the test to properly validate the function's behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: b725c519-c80d-49e5-b2b4-7972d7a3b56a
⛔ Files ignored due to path filters (2)
inst/extdata/groupComparisonModel.csvis excluded by!**/*.csvinst/extdata/groupComparisonModel_compound.csvis excluded by!**/*.csv
📒 Files selected for processing (31)
R/annotateProteinInfoFromIndra.RR/cytoscapeNetwork.RR/getSubnetworkFromIndra.RR/utils_annotateProteinInfoFromIndra.RR/utils_cytoscapeNetwork.RR/utils_getSubnetworkFromIndra.Rman/annotateProteinInfoFromIndra.Rdman/cytoscapeNetwork.Rdman/dot-populateEntityInformationInDataFrame.Rdman/dot-populateEntityInformationWithGilda.Rdman/dot-populateEntityInformationWithIndraCogex.Rdman/dot-populateHgncIdsInDataFrame.Rdman/dot-populateHgncNamesInDataFrame.Rdman/dot-populateKinaseInfoInDataFrame.Rdman/dot-populatePhophataseInfoInDataFrame.Rdman/dot-populateTranscriptionFactorInfoInDataFrame.Rdman/dot-populateUniprotIdsInDataFrame.Rdman/dot-validateAnnotateProteinInfoFromIndraInput.Rdman/exportNetworkToHTML.Rdman/getSubnetworkFromIndra.Rdman/previewNetworkInBrowser.Rdtests/testthat/test-annotateProteinInfoFromIndra.Rtests/testthat/test-exportNetworkToHTML.Rtests/testthat/test-getSubnetworkFromIndra.Rtests/testthat/test-multi-grounding.Rtests/testthat/test-utils_annotateProteinInfoFromIndra.R.Rtests/testthat/test-utils_cytoscapeNetwork.Rtests/testthat/test-utils_getSubnetworkFromIndra.Rvignettes/Cytoscape-Visualization.Rmdvignettes/MSstatsBioNet.Rmdvignettes/PTM-Analysis.Rmd
💤 Files with no reviewable changes (2)
- man/dot-populateHgncNamesInDataFrame.Rd
- man/dot-populateHgncIdsInDataFrame.Rd
There was a problem hiding this comment.
🧹 Nitpick comments (2)
tests/testthat/test-utils_annotateProteinInfoFromIndra.R.R (2)
103-107: 💤 Low valueConsider using metabolite-appropriate mock data for clarity.
The mock returns
"KIT"as one of the names for the"glucose"grounding. While structurally valid for testing multi-grounding,"KIT"is a gene name and semantically unrelated to glucose, which may confuse maintainers reading the test.Consider using metabolite-appropriate values (e.g.,
"D-Glucose"or"Glucose"for both entries) to improve test clarity.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/testthat/test-utils_annotateProteinInfoFromIndra.R.R` around lines 103 - 107, The mock data for the glucose entry contains "KIT" as a name value, which is a gene name and semantically inappropriate for a metabolite. In the glucose list definition, replace the name value "KIT" with a metabolite-appropriate name such as "D-Glucose" or "Glucose" to improve test clarity and prevent confusion for maintainers. Ensure both name entries for the multi-grounding (corresponding to the MESH and CHEBI namespaces) use metabolite-appropriate values.
99-116: 💤 Low valueAdd explicit length alignment checks for consistency.
The live test at lines 91-92 explicitly validates that
ns,id, andnamevectors have equal length—a key contract enforced by the downstream consumer (.populateEntityInformationWithGildaasserts length equality). Adding the same check here would make test coverage more consistent and defensive.♻️ Suggested addition
expect_equal(result[["EGFR"]]$ns, "HGNC") expect_equal(result[["glucose"]]$ns, c("MESH", "CHEBI")) + expect_equal(length(result[["glucose"]]$ns), length(result[["glucose"]]$id)) + expect_equal(length(result[["glucose"]]$ns), length(result[["glucose"]]$name)) expect_equal(result[["glucose"]]$id, c("3815", "17234"))🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/testthat/test-utils_annotateProteinInfoFromIndra.R.R` around lines 99 - 116, Add explicit length alignment checks to the test function `.callGroundEntitiesFromGildaApi keeps non-HGNC namespaces when keep_only is NULL (mocked)` to validate that the `ns`, `id`, and `name` vectors have equal lengths, matching the pattern used in the live test. After the existing expect_equal assertions, add checks to verify that for the "glucose" entry, all three vectors have the same length (for example, both `ns` and `id` should have length 2). This ensures consistency with the test coverage expectations and enforces the key contract that downstream consumers like `.populateEntityInformationWithGilda` depend on.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@tests/testthat/test-utils_annotateProteinInfoFromIndra.R.R`:
- Around line 103-107: The mock data for the glucose entry contains "KIT" as a
name value, which is a gene name and semantically inappropriate for a
metabolite. In the glucose list definition, replace the name value "KIT" with a
metabolite-appropriate name such as "D-Glucose" or "Glucose" to improve test
clarity and prevent confusion for maintainers. Ensure both name entries for the
multi-grounding (corresponding to the MESH and CHEBI namespaces) use
metabolite-appropriate values.
- Around line 99-116: Add explicit length alignment checks to the test function
`.callGroundEntitiesFromGildaApi keeps non-HGNC namespaces when keep_only is
NULL (mocked)` to validate that the `ns`, `id`, and `name` vectors have equal
lengths, matching the pattern used in the live test. After the existing
expect_equal assertions, add checks to verify that for the "glucose" entry, all
three vectors have the same length (for example, both `ns` and `id` should have
length 2). This ensures consistency with the test coverage expectations and
enforces the key contract that downstream consumers like
`.populateEntityInformationWithGilda` depend on.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 2c010ce9-ab68-452a-a69d-1a66d86488f1
📒 Files selected for processing (6)
R/annotateProteinInfoFromIndra.RR/utils_getSubnetworkFromIndra.Rman/annotateProteinInfoFromIndra.Rdtests/testthat/test-getSubnetworkFromIndra.Rtests/testthat/test-multi-grounding.Rtests/testthat/test-utils_annotateProteinInfoFromIndra.R.R
✅ Files skipped from review due to trivial changes (1)
- man/annotateProteinInfoFromIndra.Rd
🚧 Files skipped from review as they are similar to previous changes (4)
- tests/testthat/test-getSubnetworkFromIndra.R
- tests/testthat/test-multi-grounding.R
- R/utils_getSubnetworkFromIndra.R
- R/annotateProteinInfoFromIndra.R
Add Compound proteinIdType and entity-agnostic grounding columns:
Generalize the protein-only HgncId/HgncName contract into EntityNamespace/EntityId/EntityName grounded through Gilda, keeping multi-grounding as semicolon-joined aligned lists that fan out into the INDRA query. Gene-only annotations are skipped for compounds, and the new contract flows through annotateProteinInfoFromIndra, getSubnetworkFromIndra, and cytoscapeNetwork.
Motivation and Context
Please include relevant motivation and context of the problem along with a short summary of the solution.
Changes
Please provide a detailed bullet point list of your changes.
Testing
Please describe any unit tests you added or modified to verify your changes.
Checklist Before Requesting a Review
Motivation and Context
MSstatsBioNet previously grounded entities using a protein-only contract based on HGNC identifiers and names (
HgncId/HgncName). This limited downstream network construction/visualization to genes/proteins.This PR generalizes the grounding model to be entity-agnostic by introducing unified grounding columns (
EntityNamespace,EntityId,EntityName) that work across entity types, including compound/metabolite networks. Grounding is performed via Gilda and INDRA Cogex, with multi-candidate grounding supported by semicolon-joined, positionally aligned values.Solution Summary (high level)
proteinIdTypeto support"Metabolite"alongside existing protein-related modes.EntityNamespace/EntityId/EntityName) throughout the annotate → subnetwork → Cytoscape pipeline."Hgnc_Name"and"Metabolite"→ Gilda grounding (with optional HGNC/human filtering for"Hgnc_Name").Entity*columns, expanding into INDRA queries downstream.NAfor"Metabolite").entityName(rather thanhgncName).Detailed Changes
R/annotateProteinInfoFromIndra.RproteinIdTypeagainst an expanded allowed set including"Metabolite".EntityNamespace,EntityId,EntityName(replacing HGNC-specific population).UniprotIdfor"Hgnc_Name"and"Metabolite"inputs.EntityNamespace/EntityId/EntityName."Hgnc_Name"and"Metabolite"use new Gilda-based grounding with aligned semicolon-joined multi-candidates.proteinIdType, and return early for"Metabolite"(leaving flags asNA).R/utils_annotateProteinInfoFromIndra.R.callGetHgncIdsFromGildaApi)..callGroundEntitiesFromGildaApi(textInputs, keep_only = NULL, organisms = NULL)ground_multiterm$db(namespace),term$id(identifier), andterm$entry_name(fallback toterm$text)keep_onlyns/id/namevectors.R/getSubnetworkFromIndra.REntityNamespace/EntityId/EntityName(semicolon-joined/aligned multi-groundings).EntityNamespace/EntityIdinto Cogex rather than HGNC IDs.R/utils_getSubnetworkFromIndra.R(EntityNamespace, EntityId)pair groundings.EntityNamespace,EntityId, andEntityName..buildCogexGroundings(namespaces, ids, force_include_other = NULL)to:force_include_otherentries using namespace-aware(ns,id)parsing(ns,id)pairs..callIndraCogexApi()signature to acceptnamespacesandids(instead of HGNC ids).NAEntityIdforce_include_otheragainst semicolon-split(EntityNamespace, EntityId)pairs.rowMatchesEndpoint)EntityName/EntityIdasentityName/entityIdin downstream nodes, including for synthetic nodes.R/cytoscapeNetwork.RandR/utils_cytoscapeNetwork.RdisplayLabelType = "entityName"instead of"hgncName".buildElements(), select label column fromentityNamewhen present; otherwise fall back toid.row$entityNamefordisplay_label(fallback torow$id).Documentation / man pages / vignettes
Entity*grounding contract and"Metabolite"behavior..populateEntityInformationInDataFrame,.populateEntityInformationWithGilda,.populateEntityInformationWithIndraCogex.populateHgncIdsInDataFrame,.populateHgncNamesInDataFrameentityNameanddisplayLabelType = "entityName".Unit Tests
Added
tests/testthat/test-multi-grounding.R.buildCogexGroundingsfan-out from semicolon-joined(ns,id), handlingforce_include_other, deduplication, and error cases..rowMatchesEndpointlogic..addAdditionalMetadataToIndraEdgefor reconstructing original protein IDs from multi-grounded endpoints (source/target)..constructNodesDataFramenode schema and alignment ofentityName/entityId.Metabolitepathway forannotateProteinInfoFromIndra(..., "Metabolite"):EntityNamespace/EntityId/EntityNameUniprotIdand gene-only flags areNAfor metabolitesModified
tests/testthat/test-annotateProteinInfoFromIndra.REntityNamespace/EntityId/EntityNameinstead of HGNC-only outputs.proteinIdType.tests/testthat/test-getSubnetworkFromIndra.R.callIndraCogexApi(ns, ids, fio)EntityNamespace/EntityId.tests/testthat/test-utils_annotateProteinInfoFromIndra.R.callGroundEntitiesFromGildaApitests (includingkeep_only = "HGNC"behavior and a mocked multi-namespace case).tests/testthat/test-exportNetworkToHTML.RhgncNametoentityNameand adjust expecteddisplayLabelType.tests/testthat/test-utils_cytoscapeNetwork.R.buildElements(..., "entityName"), includingentityNameNA fallback behavior.tests/testthat/test-utils_getSubnetworkFromIndra.Rforce_include_othertest setup to useEntityNamespace/EntityId.Coding Guidelines Violations
No coding guideline violations were reported in the provided change summaries.