API 需要的信息比您提供的要多得多!看起来您已经从 Chrome 的检查工具中提取了发送到 API 的参数,但只提供了“变量”部分。通过 Web 界面执行此操作时,页面上的 JS 会根据这些变量为您进行大量格式化,而 API 看到的内容实际上要广泛得多。您可以通过 URL here 看到这一点,它实际上显示了发送到 API 的完整请求(感谢 GraphiQL 制作了如此有用的 API 接口!)。
基本上,我们需要在 R 中创建整个字符串并将整个内容发送到 API,而不仅仅是您提供的变量列表。这是一段代码的 sn-p 代码:我们定义了一个“querymaker”函数,它接收我们的变量并输出完整的字符串,然后将其传递给 httr2 函数。
querymaker <- function(start, stop, chrom, ref_genome, dataset_id){
paste0('{\n region(start: ', start, ', stop: ', stop, ', chrom: "', chrom, '", reference_genome: ', ref_genome, ') {\n clinvar_variants {\n clinical_significance\n clinvar_variation_id\n gnomad {\n exome {\n ac\n an\n filters\n }\n genome {\n ac\n an\n filters\n }\n }\n gold_stars\n hgvsc\n hgvsp\n in_gnomad\n major_consequence\n pos\n review_status\n transcript_id\n variant_id\n }\n variants(dataset: ', dataset_id, ') {\n consequence\n flags\n gene_id\n gene_symbol\n hgvs\n hgvsc\n hgvsp\n lof\n lof_filter\n lof_flags\n pos\n rsids\n transcript_id\n transcript_version\n variant_id\n exome {\n ac\n ac_hemi\n ac_hom\n an\n af\n filters\n populations {\n id\n ac\n an\n ac_hemi\n ac_hom\n }\n }\n genome {\n ac\n ac_hemi\n ac_hom\n an\n af\n filters\n populations {\n id\n ac\n an\n ac_hemi\n ac_hom\n }\n }\n lof_curation {\n verdict\n flags\n }\n }\n }\n}')
}
given_query <- querymaker(start = "55516868", stop = "55516908", chrom = "1",
ref_genome = "GRCh38", dataset_id = "gnomad_r3")
请注意带有很多换行符的超长字符串 - 这基本上是我将变量 pasteing 到的请求正文。现在我们可以将整个内容传递给 API 并获得 JSON 格式的响应:
library(httr2)
jsondata <- request("https://gnomad.broadinstitute.org/api/?") %>%
req_body_json(list(query=given_query, variables="null")) %>%
req_perform() %>%
resp_body_json()
我们最终可以使用快速的sapply 函数从中提取变体 ID:
sapply(jsondata$data$region$variants, function(x)x$variant_id)
"1-55516880-T-C" "1-55516902-T-G" "1-55516903-G-GC" "1-55516905-C-CT"
(假设这仍然是您希望提取的内容)。
编辑:
请注意,如果您仅对您can shorten the query significantly(并减少服务器负载!)的变体 ID 感兴趣,请改用以下函数:
querymaker <- function(start, stop, chrom, ref_genome, dataset_id){
paste0('{\n region(start: ', start, ', stop: ', stop, ', chrom: "', chrom, '", reference_genome: ', ref_genome, '){variants(dataset: ', dataset_id, ') {\n variant_id\n }\n }\n}')
}
其他一切都将正常运行。