Bonjour
Etant étudiant en 3ème année de MIAGE, je suis actuellement stagiaire.
Mon projet est de réaliser une plate forme web avec interface R (R est un logiciel de programmation pour tout ce qui est statistique etc... pour vous donner une idée).
Pour commencer mon chef de stage m'a demandé de réaliser un script permettant de :

_ lire un fichier .csv donnée (ça j'ai réussis !), le fichier est un simple tableau a 2 colonnes représentant les coordonnées de plusieurs points
_ executer un petit programme R sur ce fichier.

Voici le programme R en question:

# Data reading:
data=read.csv(file.choose(),header=T,sep=";",dec=",") // permet de lire un fichier cherché sur le disque dur, n'affiche rien


# Model fitting:
linear.model=lm(y~x,data=data)// estime les paramètres linéaires du modèle

# Summary information:
summary(linear.model) // affiche les paramètres linéaires du modèle

/*elle affiche ceci
Call:
lm(formula = y ~ x, data = data)

Residuals:
Min 1Q Median 3Q Max
-0.0131191 -0.0025067 0.0000646 0.0016565 0.0116565

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.004048 0.004196 477.6 < 2e-16 ***
x 2.986734 0.008813 338.9 5.14e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.007264 on 7 degrees of freedom
Multiple R-squared: 0.9999, Adjusted R-squared: 0.9999
F-statistic: 1.148e+05 on 1 and 7 DF, p-value: 5.144e-16 */

# Graphic:
with(data,plot(x,y)) //affiche sur une nouvelle fenêtre les points sur un graphes
abline(linear.model,col="red",lwd=2) // ajoute une droite sur le modèle représentant le modèle entièrement linéarisé.


je vous met aussi le script que j'ai écris:

<?php
$row = 1; // variable indiquant le numéro de la ligne traitée
if (($handle = fopen("data_xy.csv", "r+")) !== FALSE) {// si le fichier existe, traitement, sinon stop!
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {// tant que l'on n'est pas arrivée à la fin du fichier
$num = count($data);// nombre de variable sur la ligne row
echo "$num champs à la ligne $row:<br />";
$row++;//on passe à la ligne suivante
for ($c=0; $c < $num; $c++) {// tant qu'on a pas atteint la dernière variable de la ligne row
echo $data[$c] . "<br />";
}
}
fclose($handle);// fermeture du fichier
}

?>

<?php
exec "exercice.R" );
?>


la première balise PHP fonctionne et me rend donc quelques chose du genre:

2 champs à la ligne 1:
x
y
2 champs à la ligne 2:
0,21
2,63
2 champs à la ligne 3:
0,79
4,36
2 champs à la ligne 4:
0,38
3,14
etc...


après ça fonctionne pas ... et j'y comprend pas grand chose ...
Peut être que je me trompe de fonctions, mais pour moi exec est la plus adapté a ce genre de problème.

Après je n'ai jamais fait de R de ma vie mais apparamment je n'ai pas besoin de connaissance dedans...

J'espère avoir été le plus clair possible, si vous avez des questions n'hésitez pas.
Cordialement.
D'après la doc php, exec est une fonction donc exec(string) pourrait être la syntaxe appropriée.

Si c'est pas ça, vérifie le chemin vers le fichier .r si c'est toujours pas ça, vérifier que tu peux bien appeler le script par ligne de commande avec "exercice.R", il manque peut être une commande ou autre.
j'ai corrigé en mettant les parenthèse mais cela ne fonctionne toujours pas malheuresement,
après peut être qu'il manque des lignes de commandes mais je n'y connais a vrai dire pas des masses, je ne connaissais pas cette fonction.
exec permet d'exécuter une commande or exercice.R n'est pas une commande. Il s'agit juste d'un fichier de code. Il faudrait mettre le nom de l'exécuteur du langage R + le nom du fichier R.
A priori
exec ('R exercice.R')

En supposant que R soit une commande connue du système et que exercice.R soit dans le même répertoire que ton fichier PHP.
Il faudrait mieux mettre les chemins complets pour être sûr genre
exec ('/usr/bin/R /tmp/exercice.R')
je fonctionne sous windows par contre

j'ai testé comme tu me l'as dit avec les adresses absolue, cette fois ci ma page se charge mais j'ai juste la première partie de mon script qui s'affiche, c'est a dire la lecture de mon csv mais pas de traitement avec mon programme R ...

J'y comprend vraiment plus rien a ce basard ...

j'ai essayer d'autres commande pour voir du type
<?php
exec ("C:\Program Files (x86)\Notepad++\notepad++.exe");
?>
mais rien ne se passe non plus ...

je boss avec wampserver, peut être faut il régler quelques chose dessus ou un truc du genre car je suis vraiment perdu sur ce coup la ...
Modifié par belzebate (09 Jan 2012 - 16:40)
Si t'es sous windows essays exec("cmd");
Ca devrait ouvrir la fenêtre de commande DOS. cmd est accessible de partout donc ça devrait marcher.
Si ça marche, c'est nickel!
Par contre pour le chemin windows, comme il contient des espaces, il faut mettre des guillemets (et des slashs devant pour pas qu'ils soient interprétés), exec("\"C:\Program Files (x86)\Notepad++\notepad++.exe\"");
j'ai re-regarder la fiche PHP de exec. Je me pose une question, la fonction exec ne renvoit pas de résultat, donc normal que ça n'affiche rien du coup... Après comment afficher l'exec je vois pas ...
exec renvoie une chaine de caractères qui correspond à la dernière ligne affichée par la commande exécutée.
Le but de ce que j'ai proposé était de s'assurer que exec permettait bien d'exécuter les commandes en question.
Dans le cas de la commande cmd, la fenêtre de commande DOS aurait du se lancer. Ca n'a pas marché?
Pour afficher le résultat de ta commande :

<?php
$out = array();
exec = ('R exercice.R', $out);
print_r($out);
?>

=> $out renvoie sous forme de tableau le résultat de ta commande.
Pour avoir plus d'infos sur la commande exec : Définition commande exec
j'ai essayer avec ce que tu me propose.

Une première fois où ça m'affiche seulement le tableau donc exec qui ne fonctionnais pas.
Une seconde fois avec a la place de 'R exercice.R' j'ai mis '""C:\Program Files\R\R-2.14.1\bin\i386\R.exe"" -q --vanilla < "C:\wamp\www\test\exercice.R"' ça m'affiche aussi seulement l'array.
Enfin j'ai testé avec la commande system et ça n'affiche que mon premier élément de mon array ...
a écrit :
Une seconde fois avec a la place de 'R exercice.R' j'ai mis '""C:\Program Files\R\R-2.14.1\bin\i386\R.exe"" -q --vanilla < "C:\wamp\www\test\exercice.R"' ça m'affiche aussi seulement l'array.

Tu peux nous montrer l'output? Comme c'est un array, il faut un peu adapter, un truc du genre :

$out = array();
exec = ('R exercice.R', $out);
foreach($out as $key => $value) {
echo $value;
}


J'ai laissé 'R exercice.R' juste pour simplifier l'affichage.
mon code actuel :

<?php

$out = array (1, 7, 10, 9, 5);

system('""C:\Program Files\R\R-2.14.1\bin\i386\R.exe"" -q --vanilla < "C:\wamp\www\test\exercice.R"', $out);

print_r($out);

?>

me renvoie juste 1

l'array utilisé est juste a titre indicatif. Après pour voir si le programme traite l'array il me faudrait un tableau a 2 colonnes comme mon fichier .csv
le voici:


x;y
0,21;2,63
0,79;4,36
0,38;3,14
0,43;3,3
0,87;4,6
0,01;2,04
0,07;2,2
0,43;3,29
0,31;2,93
Il faut utiliser le code que je t'ai donné avec exec (en corrigeant mon erreur Smiley lol ) et non pas system.

$out = array();
exec("\"C:\Program Files\R\R-2.14.1\bin\i386\R.exe"" -q --vanilla < "C:\wamp\www\test\exercice.R\"", $out);
foreach($out as $key => $value) {
echo $value;
}

J'insiste, il ne faut pas utiliser system!
ça me rend ça:

$value) { echo $value; } ?>

en utilisant l'array que j'ai utilisé précédemment ... faut rester calme, ça fait que 4 jours que je passe mes journées dessus :'/
a écrit :
faut rester calme, ça fait que 4 jours que je passe mes journées dessus :'/

Je suis parfaitement calme Smiley lol


$out = array();

exec("\"C:\Program Files\R\R-2.14.1\bin\i386\R.exe\" -q --vanilla < C:\wamp\www\test\exercice.R", $out);

foreach($out as $key => $value) {
echo $value;
}


Normalement, ça devrait mieux marcher. Il y avait des guillemets en trop.