繁体   English   中英

可以通过对 OPENCPU 的 API 调用直接运行 R 片段吗?

[英]Can Directly run R snippet by an API call to OPENCPU?

我正在尝试使用 opencpu 服务器通过 API 调用运行 R 代码。 对于 R Markdown 它工作正常(如 opencpu 示例 markdown 应用程序中所述)。 我想直接将R代码传入opencpu并得到output。 那可能吗?

http://localhost/ocpu/.../something {"text":"R code here"}

是的,这是可能的,并且在 OpenCPU 网站上有详细记录,这里

R 函数调用的参数格式(仅限 HTTP POST)

调用函数时,我们需要传递参数。 OpenCPU 接受以下类型的参数: Argument:plain R code --- Example: paste("useR", "2013"), mtcars

我找到了三种方法来做到这一点:

  1. .r文件发布到 ../library/base/R/source 的../library/base/R/source
  2. 使用do.call
  3. 创建自己的 R package 并保存在服务器上

我将演示前两种方法:

方法一

将带有参数名称file的文件发布到../library/base/R/source

这是一个示例,在下图中,您可以看到我正在使用localhost:8004/ocpu发出 POST 请求,其中我在 Docker 容器中使用 OpenCPU 监控端口 8004。

模拟发帖请求

上面,我插入了文件test.r。 这是test.r的内容:

g = "hello world"
x = "yoyoi"

所以它只是一个两行文件。 可以看到 OpenCPU 返回 location 参数:
Location: http://localhost:8004/ocpu/tmp/x0ec7fa2f50f510/

如果您将 go 转换为 url,您将看到以下内容:

console
files/DESCRIPTION
files/test.r
info
R/.val
R/source
source

R/.val是 output R object。 因此,如果您向链接http://localhost:8004/ocpu/tmp/x0ec7fa2f50f510/R/.val发送 get 请求,您将看到运行文件test.r的 output.outputhttp://localhost:8004/ocpu/tmp/x0ec7fa2f50f510/R/.val

$value
[1] "yoyoi"

$visible
[1] FALSE

所以基本上,您可以向从您的发布请求返回的位置 url 发送获取请求。 然后你会得到最后一行test.r

方法二

您可以使用来自 package 基础的do.call来执行 function: do.call 示例

以上将返回onetwo

更详细的例子:
这是一个更详细的示例。 Since data persists on the OpenCPU server for a time, so you can use do.call in base R to execute a function on the output of utils::read.csv :

第 1 步:使用 read.csv 读取文件,在此示例中,我从此处读取汽车数据集

读取 csv

第 2 步:对 read.csv 返回的read.csv应用do.call

do.call 上的 csv

这将输出 dataframe 的前 6 行:

                  X  mpg cyl disp  hp drat    wt  qsec vs am gear carb
1         Mazda RX4 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
2     Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
3        Datsun 710 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
4    Hornet 4 Drive 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
5 Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
6           Valiant 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

您也可以返回为 JSON:

http://localhost:8004/ocpu/tmp/x0ecb9593c335da/R/.val/json

JSON 输出

我还刚刚进行了一次测试,我两次上传了汽车数据,返回了两个不同的密钥。 然后我使用key::.val表示法和do.call将两个数据帧rbind在一起。 因此,如果您使用该方法,您甚至可以拥有一个应用程序,您可以在其中上传 10 个rbind文件并将它们全部合并在一起。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM