使用 R 从 API 中检索图片
Retrieve pictures from API with R
我从未与 APIs 合作过,所以这是我的第一次尝试,我什至不知道我正在尝试做的事情是否可行。
我正在尝试从 SwissBioPics API (https://www.npmjs.com/package/%40swissprot/swissbiopics%2Dvisualizer) 获取细胞图片,并将它们放入我的 R 会话中。
res <- httr::GET('https://www.swissbiopics.org/static/swissbiopics.js',
query = list(taxisid = '9606', sls= 'SL0073',gos = '0005641'))
result <- httr::content(res$content)
但我收到此错误:
Error in httr::content(res$content) : is.response(x) is not TRUE
有什么线索吗?
您必须在 res
上调用 content
函数,而不是 res$content
。然后你得到需要转换的原始内容,例如通过
base::rawToChar(content(res))
这会导致包含一些 JS 代码的字符串
base::rawToChar(content(res))
[1] "var SwissBioPics;SwissBioPics=(()=>....
我只是快速浏览了网站,但只是下载文件呢?它还通过 API.
qurl = "https://www.swissbiopics.org/api/image/Chlamydomona_cells.svg"
fl = file.path(tempdir(), basename(qurl))
download.file(qurl, fl)
在磁盘上后,您可以在 R 中加载图像,例如通过 magick-package:
require(magick)
img = image_read_svg(fl)
print(img)
历经千辛万苦,我有了你的答案!
由于它涉及交互式图像,由 JavaScript 和 HTML 提供,此解决方案必须 运行 作为 RStudio 中的 .Rmd
文件。交互式图像也可以在同名 .html
文件中访问,当您在 RStudio 中单击 Knit 按钮时,由 knitr
输出。
第 1 步:项目设置
在 RStudio 中的新目录下创建一个新的 R 项目 my_pics
。在此项目中,创建一个新的 R Notebook(此处为 my_book.Rmd
),它应该位于上述目录下的 my_pics.Rproj
旁边。
第 2 步:支持文件
在同一目录下,创建一个 ./snippets
子目录。后者应包含以下两个 .txt
文件,从 swissbiopics-visualizer
documentation:
复制(并更正)
templates.txt
:文档中给出的第一个代码块。此处转载有必要的 EOF
和语法更正的评论:
<template id="sibSwissBioPicsStyle">
<style>
ul > li > a {
font-style:oblique;
}
ul.notpresent li > .subcell_description {
display:none;
}
</style>
</template>
<template id="sibSwissBioPicsSlLiItem">
<li class="subcellular_location">
<a class="subcell_name"></a> <!-- the class name is required and textContent will be set on it -->
<span class="subcell_description"></span> <!-- the class name is required and textContent will be set on it -->
</li>
</template>
custom_element.txt
:文档中给出的第三个代码块。转载这里有必要 EOF
:
<script type="module" src="https://www.swissbiopics.org/static/swissbiopics.js"></script>
<script defer>
if (! window.customElements.get("sib-swissbiopics-sl"))
window.customElements.define("sib-swissbiopics-sl", SwissBioPicsSL);
</script>
请注意,这些 .txt
个文件可以像 .html
个文件一样轻松保存。只有文件扩展名需要重构,在 templates
和 custom_element
参数的默认值中,对于下面 my_book.Rmd
代码中的 make_html()
函数。
第 3 步:在 RStudio 中进行交互
现在我们准备好了!在my_book.Rmd
中,写入以下内容:
---
title: "R Notebook"
output: html_document
---
```{r}
library(htmltools)
library(readr)
library(rlang)
```
# Functions #
Here are the functions that do the trick. The snippets used by `make_html()` are copied from the [documentation](https://www.npmjs.com/package/%40swissprot/swissbiopics-visualizer#usage) for `swissbiopics-visualizer`, and (after fixing the HTML comments) pasted into `.txt` files (`templates.txt` and `custom_element.txt`) under the `./snippets` subdirectory, which lies within the directory containing this `.Rproj`.
```{r}
# Create comma-separated list from vectorized (or listed) items, safely escaped.
csl <- function(items) {
return(paste("\"", paste(htmltools::htmlEscape(unlist(items)), collapse = ",", sep = ""), "\"", sep = ""))
}
# Create the HTML for the interactive imagery given by the parameters. Assembly
# process is as described the documentation for 'swissbiopics-visualizer':
# https://www.npmjs.com/package/%40swissprot/swissbiopics-visualizer#usage
make_html <- function(# The NCBI taxonomy ID.
tax_id,
# The IDs of the cellular elements to highlight.
sl_ids,
# The filepath to (or raw HTML text of) the templates
# snippet.
templates = "./snippets/templates.txt",
# The filepath to (or raw HTML text of) the custom element
# snippet.
custom_element = "./snippets/custom_element.txt",
# Further arguments to 'readr::read_file()', which might
# be useful to process snippet encodings across platforms.
...) {
# Escape any strings supplied.
tax_id <- csl(tax_id[1])
sl_ids <- csl(sl_ids)
# Compile all the HTML snippets into a list:
elements <- list()
# Include the templates (as read)...
elements$templates <- readr::read_file(file = templates, ...)
# ...then include the line (created here) to target the right picture...
elements$identifier <- "<sib-swissbiopics-sl taxid=%s sls=%s></sib-swissbiopics-sl>"
elements$identifier <- sprintf(fmt = elements$identifier, tax_id, sl_ids)
# ...and finally include the definition (as read) for the custom element.
elements$custom_element <- readr::read_file(file = custom_element, ...)
# Append these snippets together, into the full HTML code.
return(paste(unlist(elements), collapse = "\n"))
}
# Display the interactive imagery given by the parameters, visible in both
# RStudio (crowded) and the R Markdown file (well laid out).
visualize <- function(# The NCBI taxonomy ID.
taxid = "9606",
# A list (or vector) of the UniProtKB subcellular location
# (SL) IDs for the cellular elements to highlight.
sls = list("SL0073"),
# Further arguments to 'make_html()'.
...
) {
# Embed the HTML text where this function is called.
return(htmltools::HTML(make_html(tax_id = taxid, sl_ids = sls, ...)))
}
```
# Results #
Here we `visualize()` the **interactive** image, also accessible on [SwissBioPics](https://www.swissbiopics.org):
```{r}
visualize(sls = list("SL0073", "SL0138"))
```
备注
观察我们如何(在这种情况下)“懒惰地”使用 taxid
的默认值 ("9606"
),而不必指定它。还要观察我们如何 同时突出显示 而不是 多个 单独的组件,即 Contractile vacuole ("SL0073"
) and the Cell cortex ("SL0138"
).
现在在调用 visualize()
的最后一个块下方
```{r}
visualize(sls = list("SL0073", "SL0138"))
```
您将看到如下所示的交互式输出:
遗憾的是,它在 RStudio 中显得非常拥挤,可能需要 HTML 向导来更改支持 .txt
(或 .html
) 文件,以在 IDE.
内实现正确格式化 HTML
第 4 步:嵌入报告
与任何 .Rmd
文件一样,RStudio 为您提供了 Knit Markdown 结果到 .html
文件的选项,可以轻松访问和格式精美作为报告!
在 RStudio 中打开 my_book.Rmd
,单击 Knit 按钮,my_book.html
应该出现在同一目录中。您可以在网络浏览器中打开此 .html
文件(我使用 Chrome)来查看它的全部精彩内容!
总结
使用这两个交互式图像中的任何一个,您都可以悬停以突出显示图表的各个组件和层。此外,单击任何定义都会通过超链接转到其在 UnitProt.
上的配置文件
许多剩余的限制是由于 swissbiopics-visualizer
API 本身。例如,它的 mapping from GO IDs to SL IDs, via this dataset 似乎有故障。因此,您应该只向 visualize()
.
提供 SL 代码
就是说,如果您能控制 HTML 并按照您的意愿改变其布局,那就没有极限了!
尽情享受吧!
奖金
这是相同交互式输出的演示,嵌入在 Stack Overflow 中!不幸的是,它在这个环境中不稳定且非常笨拙,所以我把它留作“脚注”:
<template id="sibSwissBioPicsStyle">
<style>
ul > li > a {
font-style:oblique;
}
ul.notpresent li > .subcell_description {
display:none;
}
</style>
</template>
<template id="sibSwissBioPicsSlLiItem">
<li class="subcellular_location">
<a class="subcell_name"></a> <!-- the class name is required and textContent will be set on it -->
<span class="subcell_description"></span> <!-- the class name is required and textContent will be set on it -->
</li>
</template>
<sib-swissbiopics-sl taxid="9606" sls="SL0073,SL0138" ></sib-swissbiopics-sl>
<script type="module" src="https://www.swissbiopics.org/static/swissbiopics.js"></script>
<script defer>
if (! window.customElements.get("sib-swissbiopics-sl"))
window.customElements.define("sib-swissbiopics-sl", SwissBioPicsSL);
</script>
我从未与 APIs 合作过,所以这是我的第一次尝试,我什至不知道我正在尝试做的事情是否可行。
我正在尝试从 SwissBioPics API (https://www.npmjs.com/package/%40swissprot/swissbiopics%2Dvisualizer) 获取细胞图片,并将它们放入我的 R 会话中。
res <- httr::GET('https://www.swissbiopics.org/static/swissbiopics.js',
query = list(taxisid = '9606', sls= 'SL0073',gos = '0005641'))
result <- httr::content(res$content)
但我收到此错误:
Error in httr::content(res$content) : is.response(x) is not TRUE
有什么线索吗?
您必须在 res
上调用 content
函数,而不是 res$content
。然后你得到需要转换的原始内容,例如通过
base::rawToChar(content(res))
这会导致包含一些 JS 代码的字符串
base::rawToChar(content(res))
[1] "var SwissBioPics;SwissBioPics=(()=>....
我只是快速浏览了网站,但只是下载文件呢?它还通过 API.
qurl = "https://www.swissbiopics.org/api/image/Chlamydomona_cells.svg"
fl = file.path(tempdir(), basename(qurl))
download.file(qurl, fl)
在磁盘上后,您可以在 R 中加载图像,例如通过 magick-package:
require(magick)
img = image_read_svg(fl)
print(img)
历经千辛万苦,我有了你的答案
由于它涉及交互式图像,由 JavaScript 和 HTML 提供,此解决方案必须 运行 作为 RStudio 中的 .Rmd
文件。交互式图像也可以在同名 .html
文件中访问,当您在 RStudio 中单击 Knit 按钮时,由 knitr
输出。
第 1 步:项目设置
在 RStudio 中的新目录下创建一个新的 R 项目 my_pics
。在此项目中,创建一个新的 R Notebook(此处为 my_book.Rmd
),它应该位于上述目录下的 my_pics.Rproj
旁边。
第 2 步:支持文件
在同一目录下,创建一个 ./snippets
子目录。后者应包含以下两个 .txt
文件,从 swissbiopics-visualizer
documentation:
templates.txt
:文档中给出的第一个代码块。此处转载有必要的EOF
和语法更正的评论:
<template id="sibSwissBioPicsStyle">
<style>
ul > li > a {
font-style:oblique;
}
ul.notpresent li > .subcell_description {
display:none;
}
</style>
</template>
<template id="sibSwissBioPicsSlLiItem">
<li class="subcellular_location">
<a class="subcell_name"></a> <!-- the class name is required and textContent will be set on it -->
<span class="subcell_description"></span> <!-- the class name is required and textContent will be set on it -->
</li>
</template>
custom_element.txt
:文档中给出的第三个代码块。转载这里有必要EOF
:
<script type="module" src="https://www.swissbiopics.org/static/swissbiopics.js"></script>
<script defer>
if (! window.customElements.get("sib-swissbiopics-sl"))
window.customElements.define("sib-swissbiopics-sl", SwissBioPicsSL);
</script>
请注意,这些 .txt
个文件可以像 .html
个文件一样轻松保存。只有文件扩展名需要重构,在 templates
和 custom_element
参数的默认值中,对于下面 my_book.Rmd
代码中的 make_html()
函数。
第 3 步:在 RStudio 中进行交互
现在我们准备好了!在my_book.Rmd
中,写入以下内容:
---
title: "R Notebook"
output: html_document
---
```{r}
library(htmltools)
library(readr)
library(rlang)
```
# Functions #
Here are the functions that do the trick. The snippets used by `make_html()` are copied from the [documentation](https://www.npmjs.com/package/%40swissprot/swissbiopics-visualizer#usage) for `swissbiopics-visualizer`, and (after fixing the HTML comments) pasted into `.txt` files (`templates.txt` and `custom_element.txt`) under the `./snippets` subdirectory, which lies within the directory containing this `.Rproj`.
```{r}
# Create comma-separated list from vectorized (or listed) items, safely escaped.
csl <- function(items) {
return(paste("\"", paste(htmltools::htmlEscape(unlist(items)), collapse = ",", sep = ""), "\"", sep = ""))
}
# Create the HTML for the interactive imagery given by the parameters. Assembly
# process is as described the documentation for 'swissbiopics-visualizer':
# https://www.npmjs.com/package/%40swissprot/swissbiopics-visualizer#usage
make_html <- function(# The NCBI taxonomy ID.
tax_id,
# The IDs of the cellular elements to highlight.
sl_ids,
# The filepath to (or raw HTML text of) the templates
# snippet.
templates = "./snippets/templates.txt",
# The filepath to (or raw HTML text of) the custom element
# snippet.
custom_element = "./snippets/custom_element.txt",
# Further arguments to 'readr::read_file()', which might
# be useful to process snippet encodings across platforms.
...) {
# Escape any strings supplied.
tax_id <- csl(tax_id[1])
sl_ids <- csl(sl_ids)
# Compile all the HTML snippets into a list:
elements <- list()
# Include the templates (as read)...
elements$templates <- readr::read_file(file = templates, ...)
# ...then include the line (created here) to target the right picture...
elements$identifier <- "<sib-swissbiopics-sl taxid=%s sls=%s></sib-swissbiopics-sl>"
elements$identifier <- sprintf(fmt = elements$identifier, tax_id, sl_ids)
# ...and finally include the definition (as read) for the custom element.
elements$custom_element <- readr::read_file(file = custom_element, ...)
# Append these snippets together, into the full HTML code.
return(paste(unlist(elements), collapse = "\n"))
}
# Display the interactive imagery given by the parameters, visible in both
# RStudio (crowded) and the R Markdown file (well laid out).
visualize <- function(# The NCBI taxonomy ID.
taxid = "9606",
# A list (or vector) of the UniProtKB subcellular location
# (SL) IDs for the cellular elements to highlight.
sls = list("SL0073"),
# Further arguments to 'make_html()'.
...
) {
# Embed the HTML text where this function is called.
return(htmltools::HTML(make_html(tax_id = taxid, sl_ids = sls, ...)))
}
```
# Results #
Here we `visualize()` the **interactive** image, also accessible on [SwissBioPics](https://www.swissbiopics.org):
```{r}
visualize(sls = list("SL0073", "SL0138"))
```
备注
观察我们如何(在这种情况下)“懒惰地”使用 taxid
的默认值 ("9606"
),而不必指定它。还要观察我们如何 同时突出显示 而不是 多个 单独的组件,即 Contractile vacuole ("SL0073"
) and the Cell cortex ("SL0138"
).
现在在调用 visualize()
的最后一个块下方
```{r} visualize(sls = list("SL0073", "SL0138")) ```
您将看到如下所示的交互式输出:
遗憾的是,它在 RStudio 中显得非常拥挤,可能需要 HTML 向导来更改支持 .txt
(或 .html
) 文件,以在 IDE.
第 4 步:嵌入报告
与任何 .Rmd
文件一样,RStudio 为您提供了 Knit Markdown 结果到 .html
文件的选项,可以轻松访问和格式精美作为报告!
在 RStudio 中打开 my_book.Rmd
,单击 Knit 按钮,my_book.html
应该出现在同一目录中。您可以在网络浏览器中打开此 .html
文件(我使用 Chrome)来查看它的全部精彩内容!
总结
使用这两个交互式图像中的任何一个,您都可以悬停以突出显示图表的各个组件和层。此外,单击任何定义都会通过超链接转到其在 UnitProt.
上的配置文件许多剩余的限制是由于 swissbiopics-visualizer
API 本身。例如,它的 mapping from GO IDs to SL IDs, via this dataset 似乎有故障。因此,您应该只向 visualize()
.
就是说,如果您能控制 HTML 并按照您的意愿改变其布局,那就没有极限了!
尽情享受吧!
奖金
这是相同交互式输出的演示,嵌入在 Stack Overflow 中!不幸的是,它在这个环境中不稳定且非常笨拙,所以我把它留作“脚注”:
<template id="sibSwissBioPicsStyle">
<style>
ul > li > a {
font-style:oblique;
}
ul.notpresent li > .subcell_description {
display:none;
}
</style>
</template>
<template id="sibSwissBioPicsSlLiItem">
<li class="subcellular_location">
<a class="subcell_name"></a> <!-- the class name is required and textContent will be set on it -->
<span class="subcell_description"></span> <!-- the class name is required and textContent will be set on it -->
</li>
</template>
<sib-swissbiopics-sl taxid="9606" sls="SL0073,SL0138" ></sib-swissbiopics-sl>
<script type="module" src="https://www.swissbiopics.org/static/swissbiopics.js"></script>
<script defer>
if (! window.customElements.get("sib-swissbiopics-sl"))
window.customElements.define("sib-swissbiopics-sl", SwissBioPicsSL);
</script>