Cartographie sous R via php

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Cedric Abat
Messages : 13
Enregistré le : 28 Jan 2013, 16:31

Cartographie sous R via php

Messagepar Cedric Abat » 08 Fév 2017, 10:51

Bonjour à tous!
Je viens vers vous car je ne trouve aucune solution sur le Web concernant mon problème.
J'essaye depuis peu de réaliser une carte de la répartition de malades infectés par une espèce bactérienne donnée. Pour ce faire, je lance une page php qui interroge une base phpMyadmin et qui, après réaliser un comptage des cas par unité géographique (dans mon cas les arrondissements de Marseille), distribue les cas avec un code couleur (de plus en plus rouge selon le nombre de malades).

J'ai créé un script qui me le fait très bien si j'ouvre R mais si je passe par la commande de connexion à R sans ouverture de la console, ça ne marche plus... J'ai vérifié le code ce n'est pas un problème de traduction des variables php passées sous R

Voilà le code d'appel du script R sous php
shell_exec("Rscript.exe analyse_cartographie.R $cpM $dataM");
où $cpM contient les code postaux des arrondissements de Marseille (traduits selon les codes INSEE bien sûr) et où $dataM contient le décompte des malades par codes postaux.

Et voilà le script R

Code : Tout sélectionner

data<-data.frame(cpM,compte)
carto1<-function(data){
  library("sp")
  library("rgdal")
  library("RColorBrewer")
  library("classInt")
  library("ggmap")
  library("ggplot2")
  library("maptools")
  pathToShp<-"C:/wamp3/www/connectBDD/R/R-3.1.3/bin/shp"
  ogrInfo(dsn=pathToShp,layer="COMMUNE")
  comm<-readOGR(dsn=pathToShp,layer="COMMUNE",stringsAsFactors = FALSE)
  tmp=comm[is.element(comm$INSEE_COM,c("13208","13205","13211","13212","13215","13207","13206","13201","13213","13210","13204","13203","13209","13202","13214","13216")),]
  somme=sum(data$compte)
  taille<-length(data$compte)
  for (i in 1:taille){
    data$pourcentage[i]<-round((data$compte[i]/somme)*100,0)
  }
  data$pourcentage<-as.numeric(data$pourcentage)
  palette<-brewer.pal(n=9,name="YlOrRd")
  data$couleur<-ifelse(data$pourcentage<=10,palette[1],ifelse(data$pourcentage>10 & data$pourcentage<=20,palette[2],ifelse(data$pourcentage>20 & data$pourcentage<=30,palette[3],ifelse(data$pourcentage>30 & data$pourcentage<=40,palette[4],ifelse(data$pourcentage>40 & data$pourcentage<=50,palette[5],ifelse(data$pourcentage>50 & data$pourcentage<=60,palette[6],ifelse(data$pourcentage>60 & data$pourcentage<=70,palette[7],ifelse(data$pourcentage>70 & data$pourcentage<=80,palette[8],ifelse(data$pourcentage>80,palette[9],"NA")))))))))
  comm@data<-data.frame(tmp@data,data[match(tmp@data[,"INSEE_COM"],data$cpM), ])
  legende<-as.character(c("[0-10[","[11-20[","[21-30[","[31-40[","[41-50[","[51-60[","[61-70[","[71-80[","Plus de 80%"))
  plot(tmp,col=comm@data$couleur)
  legend("topright",legend=legende,fill=palette,title="Patients par arrondissements (%)",cex=0.6)
  p<-recordPlot()
  return(p)
}
jpeg('p.jpg', width=1200, height=800)
p<-carto1(data)
p
dev.off()

data est issu de la transformation des variables une fois celles-ci envoyées par php.

Merci par avance!

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Cartographie sous R via php

Messagepar Pierre-Yves Berrard » 09 Fév 2017, 08:43

Cedric Abat a écrit :Rscript.exe analyse_cartographie.R $cpM $dataM

Bonjour,
Ce ne seraient pas les $ devant les arguments qui posent problème ?
Il faut de plus utiliser une commande spéciale pour les récupérer dans le programme : ?commandArgs.
PY

Cedric Abat
Messages : 13
Enregistré le : 28 Jan 2013, 16:31

Re: Cartographie sous R via php

Messagepar Cedric Abat » 09 Fév 2017, 11:17

Bonjour Pierre-Yves
Merci pour votre réponse.
Les $ devant les noms des variables ne posent aucun problème sous php, j'ai déjà intégré plusieurs scripts similaires avec appel via php et ils fonctionnent tous (sous R les $ n'existent plus une fois la commande lancée). Pour la récupération des variables sous R, en effet, je n'ai pas mis tout le script R. Le voici:

Code : Tout sélectionner

args<-commandArgs(trailingOnly = TRUE)
cpM<-args[1]
taille<-length(gregexpr(",",cpM)[[1]])+1
cpM<-strsplit(cpM,",")
cpM<-unlist(cpM)
cpM2<- matrix(character(), 1, taille)
for (i in 1:taille){
  cpM2[i]<-get("cpM")[[i]]
}
cpM<-as.character(cpM2)

compte<-args[2]
taille<-length(gregexpr(",",compte)[[1]])+1
compte<-strsplit(compte,",")
compte<-unlist(compte)
compte2<- matrix(numeric(), 1, taille)
for (i in 1:taille){
  compte2[i]<-get("compte")[[i]]
}
compte<-as.numeric(compte2)
compte<-as.integer(compte)
data<-data.frame(cpM,compte)

carto1<-function(data){
  library("sp")
  library("rgdal")
  library("RColorBrewer")
  library("classInt")
  library("ggmap")
  library("ggplot2")
  library("maptools")
  pathToShp<-"C:/wamp3/www/connectBDD/R/R-3.1.3/bin/shp"
  ogrInfo(dsn=pathToShp,layer="COMMUNE")
  comm<-readOGR(dsn=pathToShp,layer="COMMUNE",stringsAsFactors = FALSE)
  tmp=comm[is.element(comm$INSEE_COM,c("13208","13205","13211","13212","13215","13207","13206","13201","13213","13210","13204","13203","13209","13202","13214","13216")),]
  somme=sum(data$compte)
  taille<-length(data$compte)
  for (i in 1:taille){
    data$pourcentage[i]<-round((data$compte[i]/somme)*100,0)
  }
  data$pourcentage<-as.numeric(data$pourcentage)
  palette<-brewer.pal(n=9,name="YlOrRd")
  data$couleur<-ifelse(data$pourcentage<=10,palette[1],ifelse(data$pourcentage>10 &   data$pourcentage<=20,palette[2],ifelse(data$pourcentage>20 & data$pourcentage<=30,palette[3],ifelse(data$pourcentage>30 & data$pourcentage<=40,palette[4],ifelse(data$pourcentage>40 & data$pourcentage<=50,palette[5],ifelse(data$pourcentage>50 & data$pourcentage<=60,palette[6],ifelse(data$pourcentage>60 & data$pourcentage<=70,palette[7],ifelse(data$pourcentage>70 & data$pourcentage<=80,palette[8],ifelse(data$pourcentage>80,palette[9],"NA")))))))))
  comm@data<-data.frame(tmp@data,data[match(tmp@data[,"INSEE_COM"],data$cpM), ])
  legende<-as.character(c("[0-10[","[11-20[","[21-30[","[31-40[","[41-50[","[51-60[","[61-70[","[71-80[","Plus de 80%"))
  plot(tmp,col=comm@data$couleur)
  legend("topright",legend=legende,fill=palette,title="Patients par arrondissements (%)",cex=0.6)
  p<-recordPlot()
  return(p)
}
jpeg('p.jpg', width=1200, height=800)
p<-carto1(data)
p
dev.off()


Pour information, lorsque je teste la variable de sortie de la commande d'appel de R sous php il me renvoie bien les variables envoyées sous R. Je suspecte vraiment la commande ogrInfo du package rgdal de ne pouvoir fonctionner 'par défaut' que lorsque R est 'ouvert'.

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: Cartographie sous R via php

Messagepar Jean-Emmanuel Longueville » 09 Fév 2017, 13:02

Bonjour Cedric Abat
Tout d'abord l'usage des balises [code ][/code] serait vraiment un plus pour améliorer la lisibilité de vos messages.
- Lancez vous les scripts sur un serveur windows ?
- Avez vous essayer de lancer le script R de la façon suivante :

Code : Tout sélectionner

shell_exec("Rscript.exe --vanilla analyse_cartographie.R $cpM $dataM");
Jean-Emmanuel
Ingénieur d'étude LNEC

Cedric Abat
Messages : 13
Enregistré le : 28 Jan 2013, 16:31

Re: Cartographie sous R via php

Messagepar Cedric Abat » 09 Fév 2017, 15:00

Bonjour Jean-Emmanuel Longueville
Merci pour votre réponse
Ok pour les balises, je ne le savais pas désolé.

Je lance les scripts en local (localhost).
Pour la commande d'envoi des variables par php, je ne pense pas que le problème soit là. En effet, cela fait plusieurs mois que j'utilise avec succès cette commande. Je pense donc que le problème est dans l'une des fonctions de R que j'utilise pour produire ma carte finale.

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: Cartographie sous R via php

Messagepar Jean-Emmanuel Longueville » 09 Fév 2017, 15:52

Pour les balises pas de soucis c'est pour ça que je me suis permis de vous le signifier (savez vous que vous pouvez toujours éditer vos message ? - le petit crayon qui apparait sous la souris quand on la passe sur le message).

C'est justement pour ça que je vous proposais d'ajouter l'argument --vanilla au lancement du script R.
Le problème pouvant venir d'un lancement différentiel de R entre la version Rscript et Rgui (pour simplifier). Ce qui entrainerai cette impression de mauvais passage de variable.

Que donne votre commande directement lancée dans un terminal ? (cmd sous windows)
Jean-Emmanuel
Ingénieur d'étude LNEC

Cedric Abat
Messages : 13
Enregistré le : 28 Jan 2013, 16:31

Re: Cartographie sous R via php

Messagepar Cedric Abat » 09 Fév 2017, 16:14

C'est bon pour les balises, merci.
Concernant le passage des variables, en testant la fonction via php je retrouve bien mes variables sous R, la preuve étant que lorsque je fais

Code : Tout sélectionner

  $return=shell_exec("Rscript.exe analyse_cartographie.R $cpM $dataM");
  var_dump($return);

la variable php $return me renvoie bien le dataframe créé sous R sur la base des deux variables php.

Concernant la seconde question posée, ça dépasse mes compétences. Pourriez-vous m'en dire davantage afin que je puisse répondre à votre question svp?
Merci

Cedric Abat
Messages : 13
Enregistré le : 28 Jan 2013, 16:31

Re: Cartographie sous R via php

Messagepar Cedric Abat » 09 Fév 2017, 16:25

Je viens d'essayer avec --vanilla et le résultat n'a malheureusement pas changé...

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: Cartographie sous R via php

Messagepar Jean-Emmanuel Longueville » 10 Fév 2017, 09:20

Je viens de relire vos scripts (merci pour les balises).
Vous ne stocker nulle part le résultat de la commande ogrInfo du coup en mode script les résultats de cette commande ne s'affiche pas et partent dans les limbes.
J'ai un petit soucis vous dites ça ne marche pas mais savez vous qu'elle partie du script dysfonctionne ? quel résultat attendu n'observez vous pas ?
Jean-Emmanuel
Ingénieur d'étude LNEC

Cedric Abat
Messages : 13
Enregistré le : 28 Jan 2013, 16:31

Re: Cartographie sous R via php

Messagepar Cedric Abat » 10 Fév 2017, 10:42

Bonjour Jean-Emmanuel
La commande qui me pose problème est la commande

Code : Tout sélectionner

readOGR

(OrgInfo n'étant pas absolument nécessaire)
Je suspecte en effet que cette dernière aie besoin que R soit ouvert pour l'une de ses fonctionnalités. Hors, lorsque je travaille avec php, R est offline.
Dès lors le plot est enregistré mais il est vierge...
Merci par avance

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Cartographie sous R via php

Messagepar Pierre-Yves Berrard » 10 Fév 2017, 10:52

Pour débugger, je suggère d'ajouter en tout début de programme l'instruction

Code : Tout sélectionner

sink("log.txt")
et en fin de programme

Code : Tout sélectionner

sink()
pour récupérer le résultat de la console et voir précisémment quel est le problème
PY

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: Cartographie sous R via php

Messagepar Jean-Emmanuel Longueville » 10 Fév 2017, 10:57

Une technique pour le vérifier
Transformer le résultat du readOGR en dataframe écrire les 10 premières lignes de ce tableau dans un fichier faire cette manip via Php et en direct et voir si une différence existe et à ce moment là votre hypothèse sera vérifiée.

Pour écrire les fichiers : ajouter cette commande juste après l'appel du readOGR

Code : Tout sélectionner

write.table(head(as.data.frame(comm)),file = "Chemin du fichier à écrire" )
Jean-Emmanuel
Ingénieur d'étude LNEC

Cedric Abat
Messages : 13
Enregistré le : 28 Jan 2013, 16:31

Re: Cartographie sous R via php

Messagepar Cedric Abat » 10 Fév 2017, 11:32

Merci pour les propositions, je teste et je reviens vers vous

Cedric Abat
Messages : 13
Enregistré le : 28 Jan 2013, 16:31

Re: Cartographie sous R via php

Messagepar Cedric Abat » 10 Fév 2017, 11:45

Je viens de tester les deux propositions:

Code : Tout sélectionner

sink("log")
sink()

a rendu fichier vierge et

Code : Tout sélectionner

write.table(head(as.data.frame(comm)),file = "C:/wamp3/www/connectBDD/R/R-3.1.3/bin/data.csv")

ne produit pas du tout de fichier...

Je ne comprends rien de ce qu'il se passe...

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Cartographie sous R via php

Messagepar Pierre-Yves Berrard » 10 Fév 2017, 12:14

Ma proposition ne marche pas car sink n'est pas la bonne fonction pour rediriger la console vers un fichier. Je me rends compte que je ne sais pas comment faire ça en fait...
PY


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité