From 200dba29428b215215d58a314b0be041ffceef13 Mon Sep 17 00:00:00 2001 From: hyginn Date: Wed, 29 Mar 2017 17:11:07 -0400 Subject: [PATCH] Added the closure isHGNCsymbol(), its factory function .fastCheckFactory() (in R/aaa.R), the script generateHGNCtable.R (in inst/scripts), the HGNC table it uses (in inst/extdata/HGNCsymbols.RDS) and its tests (in tests/testthat/testHGNCsymbol.R). The closure is created when R/isHGNCsymbol.R is being sourced. --- NAMESPACE | 1 + R/aaa.R | 30 ++++++++++++++ R/isHGNCsymbol.R | 54 +++++++++++++++++++++++++ inst/extdata/HGNCsymbols.RDS | Bin 0 -> 79135 bytes inst/scripts/generateHGNCHash.R | 59 --------------------------- inst/scripts/generateHGNCtable.R | 64 ++++++++++++++++++++++++++++++ man/isHGNCsymbol.Rd | 50 +++++++++++++++++++++++ tests/testthat/testIsHGNCsymbol.R | 19 +++++++++ 8 files changed, 218 insertions(+), 59 deletions(-) create mode 100644 R/aaa.R create mode 100644 R/isHGNCsymbol.R create mode 100644 inst/extdata/HGNCsymbols.RDS delete mode 100644 inst/scripts/generateHGNCHash.R create mode 100644 inst/scripts/generateHGNCtable.R create mode 100644 man/isHGNCsymbol.Rd create mode 100644 tests/testthat/testIsHGNCsymbol.R diff --git a/NAMESPACE b/NAMESPACE index 0dcca9b..591810e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -12,6 +12,7 @@ export(getProvenance) export(getUUID) export(importM.COSMIC) export(importNet.STRING) +export(isHGNCsymbol) export(logEvent) export(logFileName) export(logMessage) diff --git a/R/aaa.R b/R/aaa.R new file mode 100644 index 0000000..00344a5 --- /dev/null +++ b/R/aaa.R @@ -0,0 +1,30 @@ +# fastCheckFactory.R +# +# Utility function to create closures for ID validation + +.fastCheckFactory <- function(symbols) { + # Creates a closure to be used to validate whether elements of a + # character vector are present in the "symbols" data frame. + # Parameters: + # symbols: a one column dataframe + # Value: + # fCheck: a closure + + symbols$symbol[1] # force access + + fCheck <- function(x) { + # Checks whether elements of x are present in the "symbols" data + # frame which was loaded into this closure's environment. + # + # Returns a vector of logicals of the same length as x + if (missing(x) || length(x) == 0) { return(logical()) } + + return(!is.na(fastmatch::fmatch(toupper(as.character(x)), + symbols$symbol))) + + } + + return(fCheck) +} + +# [END] diff --git a/R/isHGNCsymbol.R b/R/isHGNCsymbol.R new file mode 100644 index 0000000..cc787d5 --- /dev/null +++ b/R/isHGNCsymbol.R @@ -0,0 +1,54 @@ +#' isHGNCsymbol.R +#' +#' Check whether gene symbols given are valid HGNC gene symbols. +#' +#' \code{isHGNCsymbol} Checks whether the elements of the input vector are +#' valid HGNC gene symbols (case insensitive) by comparing to a subset +#' of existing gene symbols. +#' +#' The subset of symbols used here contains only approved gene +#' symbols of the following locus types: +#' * gene with protein product +#' * immunoglobulin gene +#' * protocadherin +#' * T-cell receptor gene +#' * RNA: long non-coding, micro, ribosomal, transfer, small nuclear +#' and nucleolar, Y and vault +#' * endogenous retrovirus +#' +#' This function is a closure that contains the HGNC symbol table in its environment. It is produced as part of the .onLoad() tasks. The supporting table is stored in extdata/HGNCsymbols.RDS. The script that was used to generate this table is in scripts/generateHGNCtable.R. +#' +#' Checking is done in a case-insensitive manner. +#' +#' @param x A character vector +#' @return A vector of logicals of length x that contains TRUE for every +#' element that is present in the HGNC symbol table and FALSE +#' for all others. +#' +#' @examples +#' isHGNCsymbol() # logical() +#' isHGNCsymbol(NULL) # logical() +#' isHGNCsymbol(0) # FALSE +#' isHGNCsymbol("A2M") # TRUE +#' isHGNCsymbol(c("123", "234")) # vectorized +#' isHGNCsymbol(c("A1BG", "a1bg", "a1Bg", "A1bG")) # case insensitive +#' x <- c(NA, "A1CF", NULL, "a1bg") # length preserving: +#' length(x) # 3 +#' isHGNCsymbol(x) # FALSE, TRUE, TRUE +#' +#' @export + +isHGNCsymbol <- function(x) { + stop("This function must be overwritten by a closure factory in .onLoad()") +} + +tmp <- readRDS(system.file("extdata", + "HGNCsymbols.RDS", + package="rete")) + +isHGNCsymbol <- .fastCheckFactory(tmp) + +rm(tmp) + + +# [END] diff --git a/inst/extdata/HGNCsymbols.RDS b/inst/extdata/HGNCsymbols.RDS new file mode 100644 index 0000000000000000000000000000000000000000..c775440d87de0dbf3c84ddde86b30b0c85b91d89 GIT binary patch literal 79135 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 0) { - entryVector <- strsplit(entry, "\t") - - # Check the status and locus group of the gene. - status <- entryVector[[1]][statusCol] - locusGroup <- entryVector[[1]][locusCol] - if ((status %in% impStatuses) && (locusGroup %in% impLocusGroups)){ - # append the current gene symbol to the list of valid gene symbols. - geneSymbols <- append(geneSymbols, entryVector[[1]][symbolCol]) - } - -} - -close(HGNCFile) - -# Create a data frame with a single column containing the gene symbols. -geneNames <- data.frame( - Gene_Symbol = geneSymbols, - stringsAsFactors = FALSE) - -# Call fmatch, so that it will create a hash of the data frame. -fmatch("1", geneNames) - -# [END] diff --git a/inst/scripts/generateHGNCtable.R b/inst/scripts/generateHGNCtable.R new file mode 100644 index 0000000..409aefb --- /dev/null +++ b/inst/scripts/generateHGNCtable.R @@ -0,0 +1,64 @@ +# generateHGNCtable.R + +# Generates a data frame containing all valid HGNC gene symbols, calls fmatch +# on the data frame so it will create a hash of the data frame to be used by +# .fastCheckFactory() to build a validator closure for HGNC symbols. +# + +# Define request for the HGNC custom download CGI interface. Download gene +# symbols and locus types only. +HGNC_URL <- paste0("http://www.genenames.org/cgi-bin/download?", + "col=gd_app_sym&col=gd_locus_type", + "&status=Approved&status_opt=2", + "&where=&order_by=gd_app_sym_sort", + "&format=text&limit=&submit=submit") + +HGNCtable <- readr::read_delim(HGNC_URL, delim = "\t") + +# Whitelist for Locus Type to be included. We restrict the locus types +# to those which we consider interpreatble in the context of cancer gene +# network analysis. +# +# cat(sprintf("\"%s\",\n", unique(HGNCtable$`Locus Type`))) + +whitelistLT <- c("gene with protein product", + "RNA, long non-coding", + # "pseudogene", + # "virus integration site", + # "readthrough", + # "phenotype only", + # "unknown", + # "region", + "endogenous retrovirus", + # "fragile site", + "immunoglobulin gene", + # "immunoglobulin pseudogene", + # "transposable element", + "RNA, micro", + "RNA, ribosomal", + "RNA, transfer", + # "complex locus constituent", + "protocadherin", + # "RNA, cluster", + # "RNA, misc", + "RNA, small nuclear", + # "RNA, small cytoplasmic", + "RNA, small nucleolar", + "RNA, Y", + "T-cell receptor gene", + # "T-cell receptor pseudogene", + "RNA, vault") + +# Create a data frame with a single column containing the gene symbols. +HGNCsymbols <- data.frame(symbol = + HGNCtable$`Approved Symbol`[HGNCtable$`Locus Type` %in% whitelistLT], + stringsAsFactors = FALSE) + +# Call fmatch, so that it will attach a hash to the data frame. +fastmatch::fmatch("1", HGNCsymbols$symbol) + +# save as RDS +# saveRDS(HGNCsymbols, file = "inst/extdata/HGNCsymbols.RDS") + + +# [END] diff --git a/man/isHGNCsymbol.Rd b/man/isHGNCsymbol.Rd new file mode 100644 index 0000000..76e9497 --- /dev/null +++ b/man/isHGNCsymbol.Rd @@ -0,0 +1,50 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/isHGNCsymbol.R +\name{isHGNCsymbol} +\alias{isHGNCsymbol} +\title{isHGNCsymbol.R} +\usage{ +isHGNCsymbol(x) +} +\arguments{ +\item{x}{A character vector} +} +\value{ +A vector of logicals of length x that contains TRUE for every + element that is present in the HGNC symbol table and FALSE + for all others. +} +\description{ +Check whether gene symbols given are valid HGNC gene symbols. +} +\details{ +\code{isHGNCsymbol} Checks whether the elements of the input vector are + valid HGNC gene symbols (case insensitive) by comparing to a subset + of existing gene symbols. + +The subset of symbols used here contains only approved gene + symbols of the following locus types: + * gene with protein product + * immunoglobulin gene + * protocadherin + * T-cell receptor gene + * RNA: long non-coding, micro, ribosomal, transfer, small nuclear + and nucleolar, Y and vault + * endogenous retrovirus + +This function is a closure that contains the HGNC symbol table in its environment. It is produced as part of the .onLoad() tasks. The supporting table is stored in extdata/HGNCsymbols.RDS. The script that was used to generate this table is in scripts/generateHGNCtable.R. + +Checking is done in a case-insensitive manner. +} +\examples{ +isHGNCsymbol() # logical() +isHGNCsymbol(NULL) # logical() +isHGNCsymbol(0) # FALSE +isHGNCsymbol("A2M") # TRUE +isHGNCsymbol(c("123", "234")) # vectorized +isHGNCsymbol(c("A1BG", "a1bg", "a1Bg", "A1bG")) # case insensitive +x <- c(NA, "A1CF", NULL, "a1bg") # length preserving: +length(x) # 3 +isHGNCsymbol(x) # FALSE, TRUE, TRUE + +} diff --git a/tests/testthat/testIsHGNCsymbol.R b/tests/testthat/testIsHGNCsymbol.R new file mode 100644 index 0000000..2d7768c --- /dev/null +++ b/tests/testthat/testIsHGNCsymbol.R @@ -0,0 +1,19 @@ +# testIsHGNCsymbol.R + +context("test the closure isHGNCsymbol()") + +test_that("expected input is correctly handled", { + expect_equal(isHGNCsymbol(), logical()) + expect_equal(isHGNCsymbol(NULL), logical()) + expect_false(isHGNCsymbol(0)) + expect_true(isHGNCsymbol("A1BG")) # First in table + expect_true(isHGNCsymbol("a1bg")) # Case insensitive + expect_true(isHGNCsymbol("ZZZ3")) # Last in table + expect_equal(isHGNCsymbol(c(NA, "A1CF", NULL, "a2m")), c(FALSE, TRUE, TRUE)) +}) + +test_that("unexpected input does not lead to output", { + expect_error(isHGNCsymbol(mean), "cannot coerce") +}) + +# [END]