I've stumbled across an awesome open source project called openCPU.org and I'm tremendously excited about the project. As a research scientist trying to create a website hosting my work, I would love nothing more than to be able to run R on the cloud to have my scripts run in real time and show up on my webpages. So a big time thanks to Jeroen for making this project happen.
With that, onto my question.
How the heck do I interact with openCPU?
I can put an example function into "run some code" at:
http://public.opencpu.org/userapps/opencpu/opencpu.demo/runcode/
And retrieve a PNG image of my code, which is great!
But how do I do that in my own webpage, or via a URL?
I can get the object of my original code upload from this page, something like: "x3ce3bf3e33"
If it is a function similar to:
myfun <-function(){
x = seq(1,6.28)
y = cos(x)
p = plot(x,y)
print(p)
# also tried return(p)
}
Shouldn't I be able to call it via:
http://public.opencpu.org/R/tmp/x3ce3bf3e33/png
What about with input variables? e.g.:
myfun <-function(foo){
x = seq(1,foo)
y = cos(x)
p = plot(x,y)
print(p)
}
I feel that perhaps there is something I am missing. How do I specify "GET" or "POST" with the url?
EDIT
Ok in response to @Jeroen below, I need to use to use POST and GET with the API. Now my question is extend to the following issue of getting PHP to interact with it correctly.
Say I have the code:
<?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
?>
How do I then access what is passed back in $result? I am looking to get a graph. It looks like this:
{
"object" : null,
"graphs" : [
"x2acba9501a"
],
"files" : {}
}
The next step will be to GET the image, something along the lines of:
$newurl = "http://public.opencpu.org/R/tmp/".$result["graph"]."/png";
$image = drupal_http_request($newurl);
echo $image;
But I don't know how to access the individual elements of $result?
EDIT #2
Ok guys, I've gotten this to work, thanks to the answer below and to multiple other help sessions, and a lot of smashing my head against the monitor.
Here we go, done with 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
?>
OpenCPU uses HTTP POST to execute functions, and HTTP GET to read/render objects and graphs. You could start with saving your function to the temporary store, and then calling it from there. A basic example is given in the "/R/tmp API" chapter of the interactive manual. If you click the red demo buttons named save a function
, get the function
and call the function
it will work you through the steps.
Basically in the first step you do a HTTP POST to the identity function to save your function in the store. This is also what is being done in the third form of the running code example page that you found. So I just copied your code there and then it returned me the object x0188b9b9ce
.
To inspect if everything went OK, you can then read this object using HTTP GET. For example, open this url to read the source code of your function:
http://public.opencpu.org/R/tmp/x0188b9b9ce/ascii
Alternative outputs are for example to get the function as an RData file:
http://public.opencpu.org/R/tmp/x0188b9b9ce/rda
Important is that HTTP GET never executes functions. It just looks stuff up, and returns it in the output format that you requested. So now that you're convinced your function is there in the store we want to run it. To do this you need a HTTP POST again. For example to obtain a PDF, you can do
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
If the function you calling takes arguments, you include them as parameters to the HTTP POST request. When you want to include the output in your webpage, usually you only want to use HTTP POST in combination with the /save
output type. So you would use jquery or whatever to do:
POST http://public.opencpu.org/R/tmp/x0188b9b9ce/save
Which might return something like this:
{
"object" : null,
"graphs" : [
"x2acba9501a"
],
"files" : {}
}
This indicates that your function has been executed successfully, and it created a plot (yay!). The graphic was saved to the tmp store. So you can now obtain the graphic and embed it in your page using 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