Scrip R depuis .bat ou VBA

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

BERODIER Antoine
Messages : 7
Enregistré le : 29 Déc 2017, 14:53

Scrip R depuis .bat ou VBA

Messagepar BERODIER Antoine » 30 Déc 2017, 18:21

Bonjour,

j'ai enregistré un script utilisant SensoMineR dans lequel j'enregistre 2 des fenêtres graphiques générées par la fonction.
Ce script fonctionne bien sous R.

Par contre, en lançant le script depuis un .bat (start C:\Progra~1\R\R-3.4.3\bin\x64\Rterm.exe -f C:\MonDossier\Essai.R) ou bien depuis VBA, le script ne fonctionne pas : les graphes ne sont pas enregistrés !

Pourquoi ce problème (d'autres scripts simples fonctionnent) ?
Merci d'avance pour votre aide.

Voici le script :

options(error=utils::dump.frames)

Dataset <- readXL("C:/MonDossier/ExportJCDateDeg.xlsx", rownames=FALSE,
header=TRUE, na="", sheet="PourR", stringsAsFactors=TRUE)

results=panellipse(Dataset[,c("CodeF", "CodeJ", "NP", "NG", "El", "Fe", "Ad", "On", "So", "Fa", "Gr", "ING", "Fr",
"Sa", "Su", "Am", "Ac", "Pi", "Ox", "GtC", "Ra", "MsG")],col.p=1,col.j=2,firstvar=3,alpha=0.05,coord = c(1,2),
nbsimul =500,nbchoix =NULL,level.search.desc=0.2,scale.unit=1,variability.variable =FALSE,centerbypanelist =FALSE,
scalebypanelist=FALSE,name.panelist=FALSE)

dev.print(device = jpeg, file = "C:/MonDossier/export1.jpg", width = 600)
dev.off()
dev.prev
dev.print(device = jpeg, file = "C:/MonDossier/export2.jpg", width = 600)

Bastien Gamboa
Messages : 151
Enregistré le : 13 Jan 2011, 21:31

Re: Scrip R depuis .bat ou VBA

Messagepar Bastien Gamboa » 05 Jan 2018, 13:07

Bonjour,

Essaie de déclarer explicitement l'écriture du graphe sur le disque :

Code : Tout sélectionner

jpeg(file="....jpg", width=, ...) # Ouverture du périphérique jpg
plot(1:10) # Création du plot
dev.off() # Fermeture du dernier périphérique graphique, en l'occurence le jpg

HTH,
Bastien

BERODIER Antoine
Messages : 7
Enregistré le : 29 Déc 2017, 14:53

Re: Scrip R depuis .bat ou VBA

Messagepar BERODIER Antoine » 28 Jan 2018, 17:54

Merci Bastien pour cette réponse.
Désolé de donner suite aussi tardivement, fortes contraintes obligent.

Mais cette suggestion ne peut pas marcher.
En effet, les graphes (5) sont déjà créés par la fonction R "panellipse".
J'ai bien essayé d'ouvrir le périphérique jpg avant de lancer la fonction mais dans ce cas j'ai un fichier jpg créé vide !

Que faire ? à l'aide !
Merci

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Scrip R depuis .bat ou VBA

Messagepar Logez Maxime » 30 Jan 2018, 09:39

Bonjour,

A priori il te faudra reprendre le code de la fonction panellipse si tu veux l'utiliser en batch. La fonction fait appel à des dev.new() pour créer les différents graphs dans des fenêtres graphiques différentes. D'où le fait que ton jpeg soit vide, parce qu'au lieu de créer les graphs dans le jpeg elle va les créer dans les "devices" ouvertes par la fonction.

Cordialement,
Maxime

BERODIER Antoine
Messages : 7
Enregistré le : 29 Déc 2017, 14:53

Re: Scrip R depuis .bat ou VBA

Messagepar BERODIER Antoine » 30 Jan 2018, 18:06

Merci Maxime,
je vais voir ce que je peux faire et donnerai le résultat.

Bien cordialement.

BERODIER Antoine
Messages : 7
Enregistré le : 29 Déc 2017, 14:53

Re: Scrip R depuis .bat ou VBA

Messagepar BERODIER Antoine » 20 Fév 2018, 14:21

Bonjour,

toujours en rade pour récupérer automatiquement les graphes créés par la fonction Panellipse !!

Autre piste sans succès : une copie de la fenêtre d'un graphe par VBA fait bizarrement une copie d'écran (tout comme les touches Alt+ImpEcran) et non pas une copie de la fenêtre du graphe.

Je ne trouve pas d'autre solution et la modification suggérée par Maxime (modif. de la fonction) est hors de ma portée.

Quelqu'un pourrait-il me proposer une solution ?
Ou bien me préciser la procédure pour modifier la fonction et le contenu des modifications à apporter ?

Cordialement
Antoine

Bastien Gamboa
Messages : 151
Enregistré le : 13 Jan 2011, 21:31

Re: Scrip R depuis .bat ou VBA

Messagepar Bastien Gamboa » 22 Fév 2018, 08:35

Bonjour,

1re solution : tu utilises la faculté du lancement par batch de gérer l'enregistrement automatique sur le disque des graphes au format pdf. Normalement quand tu lances un script R en batch, les éventuels graphs produit dans des périphériques graphiques (genre dev.new(), x11()) seront enregistrés dans un seul fichier pdf nommé 'Rplot%03d.pdf' (voir ?pdf). Ce fichier devrait être produit dans le working directory du .bat.

2è solution : tu crées ta propre fonction panellipse2() en copiant tout le code de panellipse(). Les changements à faire au sein de la fonction panellipse2() sont simples : commenter/supprimer toutes les lignes contenant dev.new(). Puis tu lances ton analyse comme ceci :

Code : Tout sélectionner

pdf(file="")
results <- panellipse(...)
graphics.off()

Les deux solutions n'ont pas étaient testées, donc n'hésites pas à faire un retour au forum !

HTH,
Bastien

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Scrip R depuis .bat ou VBA

Messagepar Logez Maxime » 22 Fév 2018, 10:11

Bonjour,

Je ne connaissais pas la fonctionnalité du pdf en batch pour sauvegarder les graphs mêmes issus de fonction de création de device graphique.
Par contre avec un exemple quelconque, je n'ai pas eu un seul pdf mais un pdf par graph même avec l'argument onfile = TRUE. Est-ce qu'il y a une commande ou un argument spécifique à rajouter dans le batch pour n'avoir qu'un seul pdf ?

Cordialement,
Maxime

BERODIER Antoine
Messages : 7
Enregistré le : 29 Déc 2017, 14:53

Re: Scrip R depuis .bat ou VBA

Messagepar BERODIER Antoine » 25 Fév 2018, 16:46

Merci Bastien pour ces pistes.

En ce qui concerne la première, j'ai bien vu la création du fichier .pdf ; cependant il est vide !

Pour la seconde piste, pouvez-vous m'indiquer où trouver sur mon disque la fonction panellipse en question afin de la modifier ?
Je la trouve dans la source du plugin SensoMineR mais pas sur mon disque.
Comment faut-il alors procéder ?
Désolé, je ne maitrise pas les arcanes de R.

Cordialement.
Antoine

Bastien Gamboa
Messages : 151
Enregistré le : 13 Jan 2011, 21:31

Re: Scrip R depuis .bat ou VBA

Messagepar Bastien Gamboa » 28 Fév 2018, 09:56

Bonjour,

@Maxime : Je pense que la création d'un pdf contenant tous les graphes produit par un script R lancé par un .bat est un comportement par défaut permettant de sauver toutes les sorties de R lorsque la production des graphes n'est pas explicitement lancée dans des fichiers .jpg, .png ...
Par exemple avec ce .bat :

Code : Tout sélectionner

"C:\R-3.0.2\bin\R.exe" CMD BATCH "C:\test.R"
Et ce .R :

Code : Tout sélectionner

truc <- rnorm(10)
plot(truc)
plot(log(truc))
En lançant le .bat, un fichier 'test.Rout' et un fichier 'Rplots.pdf' sont créés dans le dossier contenant le .bat. Le pdf contenant 2 pages, une pour chaque graphe. De souvenirs si j'avais explicitement lancé les graphes dans des périphériques .jpg (par exemple), le Rplots.pdf n'est pas produit.
Est-ce que c'est la même chose chez toi ? (PI je suis sur W7 pro)

@Antoine : Tu lances 'panellipse' dans la console R (après avoir chargé le package et tu as en retour le code de la fonction. Il ne te reste plus qu'à le copier et l'éditer pour faire les changements.

HTH,
Bastien

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Scrip R depuis .bat ou VBA

Messagepar Logez Maxime » 28 Fév 2018, 10:02

Bonjour
@ Bastien
J'avais essayé de mimer le comportement de panellipse en encadrant mes commandes graphiques d'un dev.new() et dev.off() et dans ce cas j'ai un Rplots.pdf qui se crée mais qui ne contient rien et j'ai des fichiers pdfs qui se créent à chaque ouverture de device graphique.

Voila le code que j'avais tester :

Code : Tout sélectionner

# code du fichier test_batch.R
setwd("D:/test/R/")

fun <- function() {
  dev.new()
  plot(rnorm(100), rnorm(100), pch = 19, col = "blue")
  dev.off()
 
  dev.new()
  plot(rnorm(100), rnorm(100), pch = 19, col = "red")
  dev.off()
 
  dev.new()
  plot(rnorm(100), rnorm(100))
  dev.off()
 
}

pdf(onefile = TRUE)
fun()
graphics.off()

Et voila le code du fichier batch :

Code : Tout sélectionner

PATH=C:\Program Files\MRO\R-3.4.0\bin\x64;
R CMD BATCH --vanilla --args  D:\test\R\test_batch.R 1
Il est bien évidemment possible, via le logiciel adéquat de combiner les pdfs, mais je n'y suis pas arrivé directement à partir de R.

Dans un cas comme celui-ci il semble que la solution la plus efficace soit de virer tous les dev.new() et dev.off() internes.

Cordialement,
Maxime

Bastien Gamboa
Messages : 151
Enregistré le : 13 Jan 2011, 21:31

Re: Scrip R depuis .bat ou VBA

Messagepar Bastien Gamboa » 28 Fév 2018, 12:31

Bonjour,

@Maxime : Une solution qui ne me plait pas totalement, mais qui fonctionne en tout cas sur ton exemple :

Code : Tout sélectionner

# code du fichier test_batch.R
setwd("D:/test/R/")

dev.new <- function(){}

fun <- function() {
  dev.new()
  plot(rnorm(100), rnorm(100), pch = 19, col = "blue")
 
  dev.new()
  plot(rnorm(100), rnorm(100), pch = 19, col = "red")
 
  dev.new()
  plot(rnorm(100), rnorm(100))
}

fun()

rm(dev.new)
Ce script lancé en batch crée un seul fichier pdf nommé Rplots.pdf contenant un graphe par page.

HTH,
Bastien

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Scrip R depuis .bat ou VBA

Messagepar Logez Maxime » 28 Fév 2018, 13:40

@ Bastien
En effet mais c'est une autre manière de virer les dev.new() :-)

Cordialement,
Maxime

BERODIER Antoine
Messages : 7
Enregistré le : 29 Déc 2017, 14:53

Re: Scrip R depuis .bat ou VBA

Messagepar BERODIER Antoine » 01 Mar 2018, 09:26

Bonjour Bastien,

Tout d'abord, merci pour vos apports.

J'ai modifié la fonction Panellipse en supprimant les dev.new

Je l'ai enregistrée en Panellipse2.R en corrigeant la première ligne :

Code : Tout sélectionner

Panellipse2 <- function (.....


J'ai modifié mon script initial :

Code : Tout sélectionner

setwd("C:/1-Dossiers/CTFC/")
pdf(file="Essai.pdf")

source ("Panellipse2.R")

Dataset <- readXL("C:/1-Dossiers/CTFC/ExportJCDateDeg.xlsx", rownames=FALSE,
   header=TRUE, na="", sheet="PourR", stringsAsFactors=TRUE)

results <- panellipse2(Dataset[,c("CodeF", "CodeJ", "NP", "NG", "El", "Fe", "Ad", "On", "So", "Fa", "Gr", "ING", "Fr",
  "Sa", "Su", "Am", "Ac", "Pi", "Ox", "GtC", "Ra", "MsG")],col.p=1,col.j=2,firstvar=3,alpha=0.05,coord = c(1,2),
  nbsimul =500,nbchoix =NULL,level.search.desc=0.2,scale.unit=1,variability.variable =FALSE,centerbypanelist =FALSE,
  scalebypanelist=FALSE,name.panelist=FALSE)

graphics.off()


Et ça plante ! :
[32] ERREUR: Panellipse2.R
[33] ERREUR: impossible de trouver la fonction "panellipse2"

Merci pour votre aide
Antoine

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Scrip R depuis .bat ou VBA

Messagepar Logez Maxime » 01 Mar 2018, 09:39

Bonjour,

difficile de te répondre, mais de ce que tu montres dans ton dernier post, tu as une fonction

Code : Tout sélectionner

Panellipse2 <- function (.....
qui prend une majuscule alors que dans ton code elle n'en a pas

Code : Tout sélectionner

results <- panellipse2(Dataset
. Après c'est peut-être juste un mauvais copier-coller dans ton exemple et la source de l'erreur peut venir d'ailleurs.

Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

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