我偶然发现了一个名为openCPU.org的令人敬畏的开源项目,我对这个项目感到非常兴奋。作为一名研究科学家试图创建一个托管我的工作的网站,我只想能够在云上运行R来让我的脚本实时运行并显示在我的网页上。感谢Jeroen让这个项目成功,这是一个很大的时间。
有了这个,就我的问题而言。
我如何与openCPU进行互动?
我可以将一个示例函数放在“运行一些代码”中:
http://public.opencpu.org/userapps/opencpu/opencpu.demo/runcode/
并检索我的代码的PNG图像,这太棒了!
但我如何在自己的网页或网址中进行此操作?
我可以从此页面获取原始代码上传的对象,例如:“x3ce3bf3e33”
如果它是类似于:
的功能myfun <-function(){
x = seq(1,6.28)
y = cos(x)
p = plot(x,y)
print(p)
# also tried return(p)
}
我不应该通过以下方式致电:
http://public.opencpu.org/R/tmp/x3ce3bf3e33/png
输入变量怎么样? e.g:
myfun <-function(foo){
x = seq(1,foo)
y = cos(x)
p = plot(x,y)
print(p)
}
我觉得也许有些东西我不知道了。如何使用网址指定“GET”或“POST”?
修改
好的,为了回应下面的@Jeroen,我需要使用POST和GET与API。现在我的问题是扩展到让PHP正确地与它交互的以下问题。
说我有代码:
<?php
$foo = 'bar';
$options = array(
'method' => 'POST',
'foo' => $foo,
);
$url = "http://public.opencpu.org/R/tmp/x0188b9b9ce/save";
$result = drupal_http_request($url,$options); // drupal function
?>
如何访问$ result中传回的内容?我希望得到一个图表。它看起来像这样:
{
"object" : null,
"graphs" : [
"x2acba9501a"
],
"files" : {}
}
下一步是获取图像,类似于:
$newurl = "http://public.opencpu.org/R/tmp/".$result["graph"]."/png";
$image = drupal_http_request($newurl);
echo $image;
但我不知道如何访问$ result的各个元素?
编辑#2
好的伙计们,我已经让这个工作了,感谢下面的答案以及其他多个帮助会议,以及很多人对显示器的抨击。
我们开始使用cURL
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://public.opencpu.org/R/tmp/x0188b9b9ce/save');
curl_setopt($ch, CURLOPT_POST, 1); // Method is "POST"
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Returns the curl_exec string, rather than just Logical value
$result = curl_exec($ch);
curl_close($ch);
$new = json_decode($result,true); // $result is in 'json' format, decode it
$get = $new['graphs'][0]; // the 'hashkey for the image, "x2acba9501a" above
$img = 'http://public.opencpu.org/R/tmp/'.$get.'/png'; // link to the png image
echo <<<END // use this to display an image from the url
<a href="$img">
<img src="$img">
</a>
END
?>
答案 0 :(得分:3)
OpenCPU使用HTTP POST执行函数,使用HTTP GET读取/渲染对象和图形。您可以从将功能保存到临时存储开始,然后从那里调用它。 interactive manual的“/ R / tmp API”一章给出了一个基本示例。如果单击名为save a function
,get the function
和call the function
的红色演示按钮,它将帮助您完成这些步骤。
基本上,在第一步中,您对身份功能执行HTTP POST以将您的功能保存在商店中。这也是您找到的running code example page的第三种形式所做的事情。所以我只是将代码复制到那里,然后它返回了对象x0188b9b9ce
。
要检查一切是否正常,您可以使用HTTP GET读取此对象。例如,打开此URL以阅读函数的源代码:
http://public.opencpu.org/R/tmp/x0188b9b9ce/ascii
替代输出例如是将函数作为RData文件获取:
http://public.opencpu.org/R/tmp/x0188b9b9ce/rda
重要的是,HTTP GET永远不会执行功能。它只是查找内容,并以您请求的输出格式返回它。所以现在你确信你的功能在我们想要运行它的商店。为此,您需要再次使用HTTP POST。例如,要获得PDF,您可以
POST http://public.opencpu.org/R/tmp/x0188b9b9ce/pdf
POST http://public.opencpu.org/R/tmp/x0188b9b9ce/svg
POST http://public.opencpu.org/R/tmp/x0188b9b9ce/png
如果您调用的函数接受参数,则将它们作为参数包含在HTTP POST请求中。如果要在网页中包含输出,通常只需要将HTTP POST与/save
输出类型结合使用。所以你会使用jquery或其他任何事情:
POST http://public.opencpu.org/R/tmp/x0188b9b9ce/save
可能会返回以下内容:
{
"object" : null,
"graphs" : [
"x2acba9501a"
],
"files" : {}
}
这表明您的功能已成功执行,并创建了一个情节(耶!)。图形已保存到tmp商店。因此,您现在可以使用HTTP GET获取图形并将其嵌入到您的页面中:
http://public.opencpu.org/R/tmp/x2acba9501a/png
http://public.opencpu.org/R/tmp/x2acba9501a/png?!width=900&!height=500
http://public.opencpu.org/R/tmp/x2acba9501a/pdf
http://public.opencpu.org/R/tmp/x2acba9501a/svg
答案 1 :(得分:1)
这是一个完整的示例网页,我模拟使用OpenCPU使用我编写的R包(MARSS)演示特定分析。我一直在努力提供对特定分析的轻松访问 - 可以说是一个实时用户指南。 Caveat,我的例子很大程度上依赖于JavaScript,除了这个例子,我没有使用JavaScript的经验;所以编码很笨,但它适用于我的目的。将html复制并粘贴到文件中,然后在浏览器中打开,它应该可以正常工作。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
html, body
{
background: #6699FF;
text-align: center;
font-family : "Lucida Sans Unicode", "Lucida Grande", sans-serif;
font-size:14px;
}
#container
{
background: #FFF;
border: 0px #222 solid;
margin: 0 auto;
text-align: left;
width: 10.25in;
padding: 5px;
overflow: auto;
}
#container form
{
margin: 0 auto;
}
label
{
float: left;
width: 50px;
}
.leftCol
{
float: left;
width: 3in;
}
.rightCol
{
float: left;
width: 7in;
}
.references
{
font-size: x-small;
text-indent: 20px;
}
</style>
<base target="_blank" />
<title>Count-based population viability analysis (PVA) using corrupted data</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"> </script>
<script>
baseurl="http://public.opencpu.org"
// This is done on load since we need the function on the server to deal with the file upload
function saveRFunction(){
//Run this bit of code and store the R function to run on OpenCPU
var baseurl = "http://public.opencpu.org";
var url = "http://public.opencpu.org/R/pub/base/identity/save";
// #txtRCommands is the id of the text box in the javascript
var rFunction = $("#RFunction").val();
// this bit sends the the RFunction in the hidden text area
$.post(url,{ x: rFunction },
function (data) {
var funloc = $.parseJSON(data).object;
funloc = "http://public.opencpu.org/R/tmp/"+funloc;
//set the action for the form
document.getElementById('FunctionLocation').value = funloc;
} );
setTimeout(function() {
// Wait 2 seconds because of Chrome before loading default form
var frm = document.getElementById("inputForm2");
subm2(frm,'/svg');
}, 1000);
};
//function for first submit button; subm and subm2 same except the id
function subm(f,ftype){
document.getElementById("inputForm").action=document.getElementById('FunctionLocation').value+ftype;
f.submit();
}
function subm2(f,ftype){
document.getElementById("inputForm2").action=document.getElementById('FunctionLocation').value+ftype;
f.submit();
}
</script>
</head>
<body onload="saveRFunction()">
<div id="container">
<h2>MARSS Case Study 1: Count-based PVA for data with observation error</h2>
This web tool fits a count-based PVA model (sensu Dennis et al. 1991) from a univariate (one site) time series of abundance data with observation error (Holmes 2001, 2004). The result is an estimated long-term rate of population growth (λ), process variance estimate (σ<sup>2</sup>) and non-process or observation error variance. Extinction risk metrics sensu Dennis et al. (1991) along with an uncertainty plot sensu Ellner and Holmes (2008) are shown.
</br></br>
<div class="leftCol">
<form enctype="multipart/form-data" action="" method="POST" target="test" id="inputForm">
<fieldset>
<legend><b>Upload a Dataset</b></legend>
<i>Comma-delimited. 1st col time, 2nd col counts. Missing counts NA.</i></br>
File: <input name="!file:file" type="file" /> <!-- param name has to be file -->
Header: <select name="header"><option value=TRUE> TRUE </option> <option value=FALSE> FALSE </option> </select> </br />
<input name="!width" type="hidden" value=7 /> <!-- in inches -->
<input name="!height" type="hidden" value=6 /> <!-- in inches -->
<INPUT type="button" name="Submit" value="Run Analysis" onclick="subm(this.form,'/svg');"> <!-- svg so Firefox doesn't cache -->
<INPUT type="button" name="Submit" value="Get PDF of Plot" onclick="subm(this.form,'/pdf');"> </fieldset>
</form>
<form action="" method="POST" target="test" id="inputForm2">
<fieldset>
<legend><b>Select an Example Dataset</b></legend>
Dataset:
<select name="dataname">
<option value='"wilddogs"' selected >African Wilddogs</option>
<option value='"prairiechicken"'>Prairie Chickens</option>
<option value='"grouse"'>Sage Grouse</option>
<option value='"graywhales"'>Gray Whales</option>
</select></br />
<input name="!width" type="hidden" value=7 /> <!-- in inches -->
<input name="!height" type="hidden" value=6 /> <!-- in inches -->
<INPUT type="button" name="Submit" value="Run Analysis" onclick="subm2(this.form,'/svg');">
<INPUT type="button" name="Submit" value="Get PDF of Plot" onclick="subm2(this.form,'/pdf');">
</fieldset>
</form>
<fieldset class="references">
<legend><b>References</b></legend>
<p>Dennis, Brian, Patricia L. Munholland, and J. Michael Scott. "Estimation of growth and extinction parameters for endangered species." Ecological monographs 61.2 (1991): 115-143.</p>
<p>Holmes, E. E. 2001. Estimating risks in declining populations with poor data. Proceedings of the National Academy of Science 98: 5072-5077.</p>
</fieldset>
<fieldset class="references">
<legend><b>R Code</b></legend>
<!-- if you do not want to see the R code, use this <textarea hidden="hidden" id="RFunction" style="display:none;"> -->
<textarea id="RFunction" readonly="readonly" cols="27" rows="18" style="border:0px;margin:0px">
function(file=NULL, header=TRUE, dataname="wilddogs" ){
library(MARSS)
if(is.null(file)){
dat=get(dataname)
}else{
dat=read.csv(file, header=header)
dat=as.matrix(dat)
}
CSEGriskfigure(dat, silent=TRUE)
}
</textarea>
</fieldset>
<input type="hidden" value="not set" id="FunctionLocation" /> <!-- this is where the function is stored -->
<br />
</div>
<!-- This iframe holds the output image. -->
<iframe style='width: 7in; height: 6in; border: 0px solid #000000; padding: 10px;' name='test' id="image_iframe" class="rightCol"></iframe>
</div>
<!-- This is an onload script, but Chrome is not loading the whole page before running the onload script. Time out used above for this problem. -->
</body>
</html>