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.
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).