rrscript

How to run a AR query for multiple arguments of a table or list (lets say we have a column with IDs) in R


How to modify this script to read form a list of IDs and return the results ?

# Install relevant library for HTTP requests
library(httr)

# Set gene_id variable for AR (androgen receptor)
gene_id <- "ENSG00000169083"

# Build query string to get general information about AR and genetic constraint and tractability assessments 
query_string = "
  query target($ensemblId: String!){
    target(ensemblId: $ensemblId){
      id
      approvedSymbol
      biotype
      geneticConstraint {
        constraintType
        exp
        obs
        score
        oe
        oeLower
        oeUpper
      }
      tractability {
        id
        modality
        value
      }
    }
  }
"

# Set base URL of GraphQL API endpoint
base_url <- "https://api.platform.opentargets.org/api/v4/graphql"

# Set variables object of arguments to be passed to endpoint
variables <- list("ensemblId" = gene_id)

# Construct POST request body object with query string and variables
post_body <- list(query = query_string, variables = variables)

# Perform POST request
r <- POST(url=base_url, body=post_body, encode='json')

# Print data to RStudio console
print(content(r)$data)

I tried just a simple query from the documentation of Open Targets. Their graphQL API doesn't support multiple IDs.


Solution

  • Iterating over multiple IDs might be done like this:

    IDs <- c("ENSG00000169083", "ENSG00000169084", ...)
    alldata <- lapply(IDs, function(gene_id) {
      post_body <- list(query = query_string, variables = list("ensemblId" = gene_id))
      res <- tryCatch(
        POST(url=base_url, body=post_body, encode='json'),
        error = function(e) e)
      if (inherits(res, "error")) {
        warning("error for gene ", sQuote(gene_id, FALSE), ": ",
                conditionMessage(res), call. = FALSE)
        res <- NULL
      } else if (status_code(res) != 200) {
        warning("abnormal return for gene ", sQuote(gene_id, FALSE), ": ",
                status_code(res), call. = FALSE)
        res <- NULL
      } else {
        res <- content(res)$data
      }
      res
    })
    

    From here, you should have a list with one element per ID, over to you on combining the data (whether rbind, bind_rows, rbindlist, or something list-specific perhaps).