[R] png() or jpeg() in a php script
bren at juanantonio.info
bren at juanantonio.info
Wed Jun 21 20:57:34 CEST 2006
Hi, I have created a OOP version of R_PHP Project, developed by Steve Chen,
you can download the php script, here:
http://www.juanantonio.info/p_research/statistics/r/rphp/RClass.1.0.zip
<?php
class R{
//Configuration Variables
var $temp_dir;
var $R_path;
var $R_options_1;
var $R_options_2;
var $graphic;
var $bannedCommandConfigFile;
var $RCODE;
var $Rerror;
//Constructor de clase
function __construct(){
$this -> temp_dir = "tmp";
$this -> R_path = "c:/R-2.3.0/bin/Rterm.exe";
$this -> R_options_1 = "--quiet --no-restore --no-save < ";
$this -> R_options_2 = " > ";
$this -> graphic = "jpeg";
$this -> bannedCommandConfigFile = "security.txt";
}
//Metodo para establecer valores en propiedades
function setProp($PropName, $PropValue){
$this->$PropName = $PropValue;
}
//Funcion que comprueba el fichero de configuracion
function checkBCCFile(){
$lines = file($this -> bannedCommandConfigFile);
//$lines = file("security.txt");
$total = count($lines);
$j = 0;
for ($i=0;$i < $total;$i++){
$line = trim($lines[$i]);
if (!strrchr($line,"#")){
$j = $j + 1;
if (strrchr($line,"|")){
$terms = explode("|",$line);
$bad_0 = trim($terms[0]);
$bad_op = trim($terms[1]);
$bad_cmd[$j]= $bad_0;
$bad_option[$bad_0] = $bad_op;
}else{
$bad_cmd[$j]= $line;
}
}else{
continue;
}
}
echo("Comprobando el fichero de configuracion<br />");
}//End Function
//Funcion que comprueba cada linea del codigo R dado, por si emplea un
commando prohibido.
function check_bad($text,$j){
global $bad_cmd,$bad_option;
$is_bad = 0;
foreach($bad_cmd as $bad){
$bad1 = str_replace(".","\.",$bad);
if(ereg($bad1,$text)){
if(strrchr($bad,".") && (strlen($bad) > 3)){
$is_bad = 1;
}else{
// get remaining string after targer key word
$terms = explode($bad,$text);
// get rid of spaces before a possible following "("
$term1 = ltrim($terms[1]);
if($bad_option[$bad] != ""){
if(eregi($bad_option[$bad],$term1)){
// if (strstr($term1,$bad_option[$bad]))
$is_bad = 1;
}
}else{
if(substr($term1,0,1) == "("){
$is_bad = 1;
}
}
}
if($is_bad == 1){
if ($bad_option[$bad] != ""){
echo "<font color=red>$bad</font> function";
echo " with <font color=red>".$bad_option[$bad]."</font>";
echo " option is NOT permitted ";
}else{
echo "<font color=red>$bad</font> function is NOT permitted ";
echo "in Line <font color=red>$j</font><BR>";
echo "<blockquote>$text</blockquote>";
echo "Program Stopped!<BR>";
exit;
}
}
}
}
}//End function
//Funcion que genera un nombre aleatorio a ficheros
function random_str($size){
$randoms = array(
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b,
c, d, e, f, g, h, i, j, k, l, m, n,
o, p, q, r, s, t, u, v, w, x, y, z
);
srand ((double) microtime() * 1000000);
for($i = 1; $i <= $size; $i++){
$text .= $randoms[(rand(0,35))];
}
return $text;
}//End function
//Funcion que obtiene un nombre de fichero
function get_file_name($text){
// Unix : bitmap(file="something.jpg")
// Windows: jpeg(file="something.jpg")
$temp1 = explode("file=\"",$text);
$fname = explode("\"",$temp1[1]);
return $fname[0];
}//End function
function createRInputFile($r_code){
//Obtiene informacion sobre el codigo a ejecutar y lo parte en lineas
$old_code = explode(chr(10),$r_code);
$total = count($old_code);
$new_code = "";
for($i=0;$i < $total; $i++){
// replace original graphic file name with a random name
// Windows system if (ereg("jpeg",$old_code[$i]))
// if (ereg("bitmap",$old_code[$i]))
$j = $i+1;
$old = $old_code[$i];
//echo("Linea ".$i."codigo ".$old."<br />");
//Mejorar esto
//Comprueba si emplea un codigo incorrecto.
//$this-> check_bad($old,$j);
if(ereg($this -> graphic,$old_code[$i])){
$gfile_name = $this-> get_file_name($old_code[$i]);
$gfile_name = $this-> random_str(4).$gfile_name;
//$new_code .= "bitmap(file=\"$temp_dir/$gfile_name\") \n";
//$new_code .= "#ff;";
$tmp = $this ->temp_dir;
$new_code .= $this ->graphic."(file=\"tmp/$gfile_name\") \n";
}else{
$new_code .= $old_code[$i]."\n";
}
}
//echo($new_code);
$this -> r_name = $this-> random_str(10);
$this -> r_input = $this-> temp_dir."/".$this -> r_name.".R";
$this -> r_output = $this-> temp_dir."/".$this -> r_name.".Rout";
$fp = fopen($this -> r_input,"w");
fwrite($fp,$new_code);
fclose($fp);
echo("Fichero R generado <br />");
}
function execution(){
try{
// $rsoft = "/usr/local/lib/R/bin/R";
$rsoft = $this-> R_path;
// Unix :
// R BATCH --slave --no-save $r_input $r_output
//
// Windows :
// Rterm.exe --quiet --no-restore --no-save < test.R > test.Rout
// $command = "$rsoft BATCH --slave --no-save $r_input $r_output";
$command = $this-> R_path." ".$this -> R_options_1." ".$this -> r_input."
".$this -> R_options_2." ".$this -> r_output;
//echo($command);
$result = "";
$error = "";
$exec_result = exec($command,$result,$error);
echo("R CONSOLE COMMAND: ".$command."<br />");
/*
if($error){
$this -> Rerror = true;
}
*/
}catch(Exception $e){
echo "ERROR ". $e -> getCode() .
"en la linea:" . $e -> getLine() .
":" . $e-> getMessage();
$this -> Rerror = true;
}
}
function showResultsRCode(){
$lines = file($this -> r_output);
$total = count($lines);
if ($this -> Rerror){
echo "<font color=red>Error: Something wrong! Please check output!</font>";
echo "<HR>Output of R program : <P><HR>";
for ($i=0;$i < $total;$i++){
echo $lines[$i]."<BR>";
exit;
}
}
echo "Output of R program<HR>";
$to_do_plot = 0;
for ($i=0;$i < $total;$i++){
$line = $lines[$i];
// Unix : if (ereg("bitmap",$line))
// Windows: if (ereg("jpeg",$line))
if (ereg($this-> graphic,$line)){
echo $line."<BR>";
$gfile_name = $this -> get_file_name($line);
$to_do_plot = 1;
//echo "<P><IMG SRC=\"$file_name\"><P>";
}else if (ereg("dev.off",$line)){
echo $line."<BR>";
if ($to_do_plot == 1){
echo "<P><IMG SRC=\"$gfile_name\"><P>";
$to_do_plot = 0;
}
}else if (ereg("null device",$line)){
continue;
}else if (ereg(" 1",$line)){
continue;
}else{
echo $line."<BR>";
}
}
}//End function
function executeRCode($r_code){
echo("SOURCE CODE: ".$r_code."<br />");
$this -> checkBCCFile();
$this -> createRInputFile($r_code);
$this -> execution();
$this -> showResultsRCode();
}//End function
}//End Class
?>
An example to show how to execute RClass.php:
<?php
require("RClass.php");
//Instancia de clase;
$rObject = new R();
$rObject -> executeRCode($r_code);
?>
I use jpeg in the script.
>
> Message: 90
> Date: Wed, 21 Jun 2006 11:46:27 +0200
> From: "Angel Roman" <aroman6 en gmail.com>
> Subject: [R] png() or jpeg() in a php script
> To: r-help en stat.math.ethz.ch
> Message-ID:
> <f452beeb0606210246n7d484937o3467e4b7030e03c1 en mail.gmail.com>
> Content-Type: text/plain
>
> Hello,
>
> I've got a problem with a PHP script, in which I call the system function
> (to call another processes). The call is :
>
> system("R --slave --vanilla < path/to/source/source.R");
>
> if in this R file, I've got the lines:
> pdf(file="/path/to/file/file.pdf")
> commands
> dev.off()
>
> the pdf file is perfectly created
>
> but if I change the lines to:
>
> png(file="/path/to/file/file.png");
> commands
> dev.off()
>
> (or with the jpeg() function)
>
> the files are not created. any help?
>
> Thanks
>
> [[alternative HTML version deleted]]
>
>
>
> ------------------------------
>
> _______________________________________________
> R-help en stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE read the posting guide! http://www.R-project.org/posting-guide.html
>
>
> End of R-help Digest, Vol 40, Issue 21
> **************************************
Juan Antonio Breña Moral.
Advanced Marketing Ph.D. , URJC, Spain (Now)
Industrial Organisation Engineering, ICAI, Spain.
Technical Computer Programming Engineering, ICAI, Spain
Web: http://www.juanantonio.info
Mobile: +34 655970320
More information about the R-help
mailing list