Annonce

Bienvenue sur le site support de mes ouvrages d'introduction à SAS

La 4ème édition de mon ouvrage est disponible depuis le 11 avril 2019 !

Où trouver cet ouvrage ?


#1 23-10-2019 06:22:43

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

on va la jouer "Breaking Bad" !

oui, je sais, je suis très en retard dans mes références... puisque cette série a été diffusée entre 2008 et 2013...

donc, vous devinez que je regarde actuellement cette série... et lorsqu'on cherche un sujet pour un beau mercredi, il faut faire feu de tout bois...

C'est en regardant le générique de cette série que j'ai eu une idée...

https://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Breaking_Bad_logo.svg/220px-Breaking_Bad_logo.svg.png

Lorsqu'un nom d'acteur apparaît dans le générique, si une suite de deux lettres constitue un symbole qui apparait dans le tableau périodique des éléments, alors il fait l'objet d'une mise en forme particulière.

un exemple ?
avant / après

http://www.sas-sr.com/img/BBad.png

bon... ce n'est pas encore parfait mais on verra par la suite qu'on peut faire mieux... (le cadre vert, le numéro de l'élément dans le tableau...)

Voici la liste des éléments périodiques (à laquelle nous avons fait subir une légère modification...)

Code:

1 hydrogene H
2 helium He
3 lithium Li
4 beryllium Be
5 bore B
6 carbone C
7 azote N
8 oxygene O
9 fluor F
10 neon Ne
11 sodium Na
12 magnesium Mg
13 aluminium Al
14 silicium Si
15 phosphore P
16 soufre S
17 chlore Cl
18 argon Ar
19 potassium K
20 calcium Ca
21 scandium Sc
22 titane Ti
23 vanadium V
24 chrome Cr
25 manganese Mn
26 fer Fe
27 cobalt Co
28 nickel Ni
29 cuivre Cu
30 zinc Zn
31 gallium Ga
32 germanium Ge
33 arsenic As
34 selenium Se
35 brome Br
36 krypton Kr
37 rubidium Rb
38 strontium Sr
39 yttrium Y
40 zirconium Zr
41 niobium Nb
42 molybdene Mo
43 technetium Tc
44 ruthenium Ru
45 rhodium Rh
46 palladium Pd
47 argent Ag
48 cadmium Cd
49 indium In
50 etain Sn
51 antimoine Sb
52 tellure Te
53 iode I
54 xenon Xe
55 cesium Cs
56 baryum Ba
57 lanthane La
58 cerium Ce
59 praseodyme Pr
60 neodyme Nd
61 promethium Pm
62 samarium Sm
63 europium Eu
64 gadolinium Gd
65 terbium Tb
66 dysprosium Dy
67 holmium Ho
68 erbium Er
69 thulium Tm
70 ytterbium Yb
71 lutecium Lu
72 hafnium Hf
73 tantale Ta
74 tungstene W
75 rhenium Re
76 osmium Os
77 iridium Ir
78 platine Pt
79 or Au
80 mercure Hg
81 thallium Tl
82 plomb Pb
83 bismuth Bi
84 polonium Po
85 astate At
86 radon Rn
87 francium Fr
88 radium Ra
89 actinium Ac
90 thorium Th
91 protactinium Pa
92 uranium U
93 neptunium Np
94 plutonium Pu
95 americium Am
96 curium Cm
97 berkelium Bk
98 californium Cf
99 einsteinium Es
100 fermium Fm
101 mendelevium Md
102 nobelium No
103 lawrencium Lr
104 rutherfordium Rf
105 dubnium Db
106 seaborgium Sg
107 bohrium Bh
108 hassium Hs
109 meitnerium Mt
110 darmstadtium Ds
111 roentgenium Rg
112 copernicium Cn
113 ununtrium Uut
114 flerovium Fl
115 ununpentium Uup
116 livermorium Lv
117 ununseptium Uus
118 Lemmium Le

lla modification ? L'élément 118 ne s'appelle pas le Lemmium mais l'Ununoctium... et le symbole Le n'existe pas (normalement, c'est Uuo...)

mais bon... cet élément a été ajouté, avec 3 autres éléments "super lourds" et radioactifs en janvier 2016, soit quelques jours après le décès de Lemmy Kilmister, le leader de Motorhead.

Des fans de Motorhead ont alors lancé une pétition pour ce nouvel élément soit nommé en hommage à Lemmy.

http://www.bbc.co.uk/newsbeat/article/3 … fter-lemmy

plus de 150 000 personnes ont signé la pétition... j'ai donc anticipé un peu en renommant cet élément...

bref...

on ne conserve pas tous les symboles : seuls les symboles contenant deux lettres seront utilisés.

voici les noms des 10 derniers acteurs à avoir obtenu l'oscar du meilleur acteur :

Code:

Rami Malek
Gary Oldman
Casey Affleck
Leonardo DiCaprio
Eddie Redmayne
Matthew McConaughey
Daniel Day-Lewis
Jean Dujardin
Colin Firth
Jeff Bridges

vous devez écrire un programme qui "analysera" ces noms et qui appliquera une mise en forme particulière si vous observez dans le nom, le symbole d'un élément périodique.

ça vous semble compliqué ?

pourtant, tout ce que vous avez besoin de savoir est dans mon bouquin...

à la semaine prochaine

Hors ligne

 

#2 30-10-2019 11:03:46

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

Re: on va la jouer "Breaking Bad" !

j'ai reçu deux propositions de solution : celle de Yannick et celle d'Antoine.

La solution d'Antoine étant la plus complète, nous la présenterons à la suite de notre proposition de solution.

alors, regardons cela...

on va commencer par créer les tables PERIODIC et ACTOR :

Code:

data periodic;
input num name :$20. symbol $ ;
cards;
1 hydrogene H
2 helium He
3 lithium Li
4 beryllium Be
5 bore B
6 carbone C
7 azote N
8 oxygene O
9 fluor F
10 neon Ne
11 sodium Na
12 magnesium Mg
13 aluminium Al
14 silicium Si
15 phosphore P
16 soufre S
17 chlore Cl
18 argon Ar
19 potassium K
20 calcium Ca
21 scandium Sc
22 titane Ti
23 vanadium V
24 chrome Cr
25 manganese Mn
26 fer Fe
27 cobalt Co
28 nickel Ni
29 cuivre Cu
30 zinc Zn
31 gallium Ga
32 germanium Ge
33 arsenic As
34 selenium Se
35 brome Br
36 krypton Kr
37 rubidium Rb
38 strontium Sr
39 yttrium Y
40 zirconium Zr
41 niobium Nb
42 molybdene Mo
43 technetium Tc
44 ruthenium Ru
45 rhodium Rh
46 palladium Pd
47 argent Ag
48 cadmium Cd
49 indium In
50 etain Sn
51 antimoine Sb
52 tellure Te
53 iode I
54 xenon Xe
55 cesium Cs
56 baryum Ba
57 lanthane La
58 cerium Ce
59 praseodyme Pr
60 neodyme Nd
61 promethium Pm
62 samarium Sm
63 europium Eu
64 gadolinium Gd
65 terbium Tb
66 dysprosium Dy
67 holmium Ho
68 erbium Er
69 thulium Tm
70 ytterbium Yb
71 lutecium Lu
72 hafnium Hf
73 tantale Ta
74 tungstene W
75 rhenium Re
76 osmium Os
77 iridium Ir
78 platine Pt
79 or Au
80 mercure Hg
81 thallium Tl
82 plomb Pb
83 bismuth Bi
84 polonium Po
85 astate At
86 radon Rn
87 francium Fr
88 radium Ra
89 actinium Ac
90 thorium Th
91 protactinium Pa
92 uranium U
93 neptunium Np
94 plutonium Pu
95 americium Am
96 curium Cm
97 berkelium Bk
98 californium Cf
99 einsteinium Es
100 fermium Fm
101 mendelevium Md
102 nobelium No
103 lawrencium Lr
104 rutherfordium Rf
105 dubnium Db
106 seaborgium Sg
107 bohrium Bh
108 hassium Hs
109 meitnerium Mt
110 darmstadtium Ds
111 roentgenium Rg
112 copernicium Cn
113 ununtrium Uut
114 flerovium Fl
115 ununpentium Uup
116 livermorium Lv
117 ununseptium Uus
118 Lemmium Le
;

data actor;
input actor $50.;
cards;
Rami Malek
Gary Oldman
Casey Affleck
Leonardo DiCaprio
Eddie Redmayne
Matthew McConaughey
Daniel Day-Lewis
Jean Dujardin
Colir Firth
Jeff Bridges
;

rien de neuf sous le soleil....

Bricolons la table PERIODIC :

Code:

proc transpose data=periodic(keep=symbol where=(length(symbol)=2)) out=periodic2(drop=_:) prefix=SY;
var symbol;
run;

nous transposons la table PERIODIC, uniquement la variable SYMBOL et uniquement si le symbole s'écrit avec deux lettres. Voici un extrait ce cette table :

Code:

Obs.    SY1    SY2    SY3    SY4    SY5    SY6    SY7    SY8    SY9    SY10

  1     He     Li     Be     Ne     Na     Mg     Al     Si     Cl      Ar

notre table ne contient d'une seule observation (puisqu'on ne conserve qu'une variable de la table PERIODIC) et on dispose d'un certain nombre de variables SYx qui ont pour modalité nos symboles.

et bien entendu, nous allons utiliser cette table...

voici le début de l'étape DATA qui va nous permettre de "breakingbadiser" les noms de nos acteurs :

Code:

data actor2(keep=actor:);
   set actor;
   if _n_=1 then set periodic2;
   array sy(*) sy: ;
...

la "petite manoeuvre"    if _n_=1 then set periodic2; va nous permettre de disposer, dans le PDV, de nos variables SYx que l'on va regrouper dans un tableau de variables SY. Ces variables SY ne sont pas créées par le programme : à la fin de chaque exécution, le RESET ne s'appliquera pas à ces variables et on disposera bien, pour chaque exécution des symboles.

Nous verrons en examinant la solution que m'a proposé Antoine, qu'on pouvait faire autrement (il y a toujours plusieurs façons de faire avec SAS...) mais comme je n'ai pas utilisé très souvent dans ces beaux mercredis le coup du "if _n_=1 then set", je me suis dit que j'avais là une bonne occasion de vous proposer un exemple (bien entendu, vous pouvez aussi relire la page 336 ED4 puisque j'y présente un exemple d'utilisation d ce if _n_=1 then set).

que va-t-on faire ensuite ?

déjà revenir un peu en arrière parce que j'ai oublié un truc...

Code:

ods escapechar='^';

et oui... on va en avoir besoin...

Code:

data actor2(keep=actor:);
   set actor;
   if _n_=1 then set periodic2;
   array sy(*) sy: ;
   length actor2 $ 200 ;
   actor2=actor;
   do i=1 to length(actor)-1;
     do j=1 to dim(sy);
        if lowcase(substr(actor,i,2))=lowcase(sy(j)) then do;
            actor2=tranwrd(actor2,substr(actor,i,2),"^{STYLE HEADER "||compress(sy(j)||'}'));
         end;
   end;
   end;
run;

on crée une variable ACTOR2 de longueur 200 qui, au départ à la même modalité que ACTOR.

puis.. :

Code:

   do i=1 to length(actor)-1;
     do j=1 to dim(sy);
        if lowcase(substr(actor,i,2))=lowcase(sy(j)) then do;

cette double boucle va nous permettre de voir si deux lettres consécutives de la modalité d'ACTOR ne seraient pas identiques à un des symboles stockés dans le tableau de variables SY. Si c'est le cas, alors :

Code:

            actor2=tranwrd(actor2,substr(actor,i,2),"^{STYLE HEADER "||compress(sy(j)||'}'));

on demande à remplacer dans ACTOR2, les deux caractères qu'on a identifié comme étant un symbole (admettons que celui-ci soit He) par :
^{STYLE HEADER He}

la fonction COMPRESS est utilisée ici pour supprimer les blancs qui ne manqueraient pas d'apparaître si on concaténait simplement au moyen de || le symboles avec l'accolade fermante.

Evidemment, ça peut paraître un peu compliqué... et il faut dans ce cas relire la section 8.3.5.b.

on obtient :
http://www.sas-sr.com/img/brba2.png

et la solution d'Antoine ?

elle va passer par des macro-variables.

il construit un ensemble de macro-variables ELEMxx dans lesquels il stocke les symboles

Code:

data _null_;
   set periodic end=last;
   call symputx(compress("elem"||num),symbole);
   if last then call symputx("nelem",num);
run;

la macro-variable NELEM lui indique combien de macro variables il a construit.

puis :

Code:

ods escapechar="#";

data breaking_bad;
   length acteur $ 200;
   set acteur;
   acteur2=acteur;
   do i=1 to &nelem;
      if length(symget(compress("elem"||i)))=2  then do;
          y=find(lowcase(acteur2),lowcase(symget(compress("elem"||i))));
          if y ne 0 then do; 
             acteur=tranwrd(acteur,symget(compress("elem"||i)),"#{STYLE HEADER "||symget(compress("elem"||i))||"}");
             acteur=tranwrd(acteur,lowcase(symget(compress("elem"||i))),"#{STYLE HEADER "||symget(compress("elem"||i))||"}");
          end;
      end;
   end;
   keep acteur;
run;

le principe est la suivant :

do i=1 to &nelem;
la boucle sur I tournera autant de fois qu'il y a de macro-variables.

if length(symget(compress("elem"||i)))=2  then do;
si la longueur du symbole contenu dans la macro-variable est égale à 2 alors, on va faire certaines choses (si non, rien)

y=find(lowcase(acteur2),lowcase(symget(compress("elem"||i))));
au moyen de FIND, on recherche si dans la modalité d'acteur (passé en minuscules), on retrouve le symbole. Si oui, alors Y>0 (et si non, alors Y=0)

if y ne 0 then do;
on a des choses à faire si Y est différent de zéro

acteur=tranwrd(acteur,symget(compress("elem"||i)),"#{STYLE HEADER "||symget(compress("elem"||i))||"}");
acteur=tranwrd(acteur,lowcase(symget(compress("elem"||i))),"#{STYLE HEADER "||symget(compress("elem"||i))||"}");

ce qui est fait ensuite est quasiment identique à ce que l'on propose. Antoine s'y prend à deux fois pour pouvoir replacer dans la modalité d'ACTEUR, le symbole avec sa demande de mise en forme :
une première fois pour remplacer le symbole écrit avec la première lettre en majuscule
une seconde fois pour remplacler le symbole écrit tout en minuscules.

très amusant ! (enfin moi, ça m'amuse...)

continuons à nous amuser :

pour la semaine prochaine, il va nous falloir obtenir ceci :

http://www.sas-sr.com/img/brba3.png

Nous tentons de nous rapprocher le plus possible de l'illustration suivante :
https://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Breaking_Bad_logo.svg/220px-Breaking_Bad_logo.svg.png

le résultat que je vous présente est un simple proc print sur la table constuite cette semaine....

j'ai donc modifier autre chose puisque je n'ai pas modifié la table...

"mais vous avez utilisé quelque chose qui est présenté dans votre livre ?"
hum... oui et non.. oui si vous travaillez avec l'édition 2 ou 3, non, si vous travaillez avec l'édition 4 (parce que ça fait partie des trucs que j'ai retiré dans l'édition 4...)

aussi, je vous donne une piste : il faut déjà travailler avec le tagset style_display...

à la semaine prochaine...

Hors ligne

 

#3 07-11-2019 10:45:38

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

Re: on va la jouer "Breaking Bad" !

poursuivons... (je sais, nous sommes jeudi et je suis en retard...)

pour arriver au résultat demandé la semaine dernière, deux approches sont possibles : soit on "enrichit" l'instruction qui commande la construction de la variable ACTOR2 pour modifier la police, la couleur de celle-ci, la couleur de fond et l'encadrement (en oubliant pas qu'à la fin, il va nous falloir aussi ajouter le numéro de l'élément...), soit on modifie on adapte le style utilisé...

Yannick m'a contacté pour me transmettre son programme et il a opté pour la première méthode. Il obtient des résultats partiellement corrects (bravo à lui !) mais observe aussi des choses étranges (et surtout des messages dans le journal difficilement compréhensibles).

voyons plutôt la seconde approche...

il peut sembler effrayant d'adapter le style utilisé pour simplement obtenir le résultat décrit mais, en fait, c'est assez simple quand on connait le tagset style_display.

Ce tagset faisait l'objet d'une présentation dans les éditions 1, 2 et 3 de mon bouquin et j'ai choisi de ne pas le présenter dans l'édition 4 : réparons cette erreur !

Ce tagset est un tagset de diagnostic. Il vous permet d'obtenir des informations sur les éléments de style qui commandent la présentation de votre résultat.

exécutons le programme suivant :

Code:

ods html close;
ods tagsets.style_display body="test.html" style=htmlblue;
proc print data=actor2;
var actor actor2;
run;
ods tagsets.style_display close;

vous allez observez dans votre fenêtre résultat la chose suivante :

http://www.sas-sr.com/img/display1.png


Lorsque vous promenez votre souris sur le résultat, la partie de la sortie sur laquelle est votre curseur apparaît en rose.

Puisque nous utilisons l'élément de style HEADER pour mettre en forme notre résultat, nous avons cliqué sur l'entête du tableau et là... tada ! une nouvelle fenêtre s'est ouverte vous offrant la liste des attributs qui président à la mise en forme de l'entête.

Vous pouvez alors copier/coller ce qui apparaît dans cette fenêtre afin de modifier la valeur certains attributs et c'est ainsi que nous allons créer un nouveau style.

Ce nouveau style n'est pas crée ex nihilo : en fait, il va être identique au style HTMLBLUE sauf en ce qui concerne l'élément HEADER.

Pour créer un nouveau style basé sur le style HTMLBLUE existant, votre programmation est la suivante :

Code:

PROC TEMPLATE ;
   DEFINE style breakingbad;
   PARENT=styles.htmlblue;

vous placez à la suite de ces instructions, l'instruction STYLE que vous avez copié/collé et pouvez ensuite modifier les valeurs prises par certains attributs :

Code:

PROC TEMPLATE ;
   DEFINE style breakingbad;
   PARENT=styles.htmlblue;

STYLE header /
   FONTFAMILY = "Arial, 'Albany AMT', Helvetica, Helv"
   FONTSIZE = 2
   FONTWEIGHT = bold
   FONTSTYLE = roman
   COLOR = #ffffff
   BACKGROUNDCOLOR = #284f32
   BORDERTOPWIDTH = 1px
   BORDERTOPCOLOR = #171f19
   BORDERTOPSTYLE = solid
   BORDERBOTTOMWIDTH = 1px
   BORDERBOTTOMCOLOR = #171f19
   BORDERBOTTOMSTYLE = solid
   BORDERLEFTWIDTH = 1px
   BORDERLEFTCOLOR = #171f19
   BORDERLEFTSTYLE = solid
   BORDERRIGHTWIDTH = 1px
   BORDERRIGHTCOLOR = #171f19
   BORDERRIGHTSTYLE = solid
;
end;
run;

Nous demandons que le texte soit affiché en blanc (COLOR = #ffffff) et que la couleur de fond soit #284f32 (une sorte de vert anglais qui viendra remplacer le bleu clair propre au style HTMLBLUE).

Dans le style HTMLBLUE, il n'y a pas d'encadrement au dessus et à gauche. Nous ajoutons ces encadrements au moyen des attributs BORDERTOPWIDTH et BORDERLEFTWIDTH.

Nous précisons aussi que ces encadrements doivent apparaitre avec la couleur #171f19 (un vert un peu plus soutenu que le vert anglais #284f32).

exécutons ce premier PROC TEMPLATE puis le programme suivant :

Code:

ods html close;
ods html style=breakingbad;
proc print data=actor2;
var actor actor2;
run;

vous obtiendrez le résultat suivant :
http://www.sas-sr.com/img/display2.png

Ce "nouveau style" peut continuer à être amendé : si vous regardez à nouveau l'image "breaking bad" (reprise de wikipedia), vous noterez que la police utilisée pour le symbol est différente de la police utilisée pour le reste du texte. Nous allons aussi reproduire cette caractéristique.

on exécute le programme suivant :

Code:

ods html close;
ods tagsets.style_display body="test.html" style=breakingbad2;
proc print data=actor2;
var actor actor2;
run;
ods tagsets.style_display close;

et cliquons dans une case du tableau produit pour obtenir le code de l'élément de style DATA. On intègre ensuite ce code dans notre PROC TEMPLATE :

Code:

proc template ;
  define style breakingbad;
  parent=styles.htmlblue;
STYLE header /
   FONTFAMILY = "Arial, 'Albany AMT', Helvetica, Helv"
   FONTSIZE = 2
   FONTWEIGHT = bold
   FONTSTYLE = roman
   COLOR = #ffffff
   BACKGROUNDCOLOR = #284f32
   BORDERTOPWIDTH = 1px
   BORDERTOPCOLOR = #171f19
   BORDERTOPSTYLE = solid
   BORDERBOTTOMWIDTH = 1px
   BORDERBOTTOMCOLOR = #171f19
   BORDERBOTTOMSTYLE = solid
   BORDERLEFTWIDTH = 1px
   BORDERLEFTCOLOR = #171f19
   BORDERLEFTSTYLE = solid
   BORDERRIGHTWIDTH = 1px
   BORDERRIGHTCOLOR = #171f19
   BORDERRIGHTSTYLE = solid
;
STYLE data /
   FONTFAMILY = "'Times New Roman', 'Albany AMT', Helvetica, Helv"
   FONTSIZE = 2
   FONTWEIGHT = medium
   FONTSTYLE = roman
   COLOR = #284f32
   BACKGROUNDCOLOR = cxffffff
   BORDERTOPWIDTH = 0px
   BORDERTOPCOLOR = #c1c1c1
   BORDERTOPSTYLE = solid
   BORDERBOTTOMWIDTH = 1px
   BORDERBOTTOMCOLOR = #c1c1c1
   BORDERBOTTOMSTYLE = solid
   BORDERLEFTWIDTH = 0px
   BORDERLEFTCOLOR = #c1c1c1
   BORDERLEFTSTYLE = solid
   BORDERRIGHTWIDTH = 1px
   BORDERRIGHTCOLOR = #c1c1c1
   BORDERRIGHTSTYLE = solid
;
end;
run;

deux modifications sont introduites :

Code:

   FONTFAMILY = "'Times New Roman', 'Albany AMT', Helvetica, Helv"
   COLOR = #284f32

(si une police porte un nom composé de plusieurs mots, le nom de la police soit être encadré par des quotes).

Exécutez à nouveau le programme suivant :

Code:

ods html close;
ods html style=breakingbad;
proc print data=actor2;
var actor actor2;
run;

(je vous invite à systématiquement demander la fermeture de la destination HTML avant de demander la production d'un résultat construit en utilisant un style que vous venez de définir ou de redéfinir).

vous obtiendrez alors le résultat suivant :
http://www.sas-sr.com/img/display3.png

vous trouvez que le fond bleu de la colonne obs. fait tache ?

Vous connaissez maintenant la méthode à suivre pour "assortir" cette colonne avec le reste du résultat.

En avons-nous fini ?

et bien non... il nous reste à positionner le numéro de l'élément pour obtenir ce résultat :

http://www.sas-sr.com/img/display4.png

ce serait ^super, non ?

à la semaine prochaine

Hors ligne

 

#4 13-11-2019 11:37:23

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

Re: on va la jouer "Breaking Bad" !

Concluons ce ^super sujet des beaux mercredis.

nous allons bien entendu utiliser la fonction super autorisée par ODS ESCAPECHAR (voir page 457 ED4).

Nous allons cependant faire quelques "essais" avant de l'appliquer à nos acteurs pour les breakingbadiser définitivement.

Regardons ce que l'on obtient par défaut au moyen du programme suivant :

Code:

ods html close ;
ods html style=breakingbad;
title1 "X puissance Y soit X^{super 17}";
title2 "Nicolas Ca^{style header Ge^{super 17}}";

proc print;
var actor actor2 ;
run;

http://www.sas-sr.com/img/super1.png

hum... disons le tout de suite, nous ne pourrons pas avoir le numéro juste au dessus de la seconde lettre du symbole.

le 17 est cependant trop gros... pouvons nous réduire sa taille ? bien entendu !

Code:

ods html close ;
ods html style=breakingbad;
title1 "X puissance Y soit X^{style[fontsize=5pt]^{super 17}}";
title2 "Nicolas Ca^{style header Ge^{style[fontsize=5pt]^{super 17}}}";

proc print;
var actor actor2 ;
run;

http://www.sas-sr.com/img/super2.png

bon... déjà, il ne faut pas s'embrouiller dans les accolades... nous utilisons ici le fait que les mises en forme autorisée par escapechar sont cumulatives (voir page 458 ED4).

Pour le second titre, nous commençons par demander l'application de l'élément de style HEADER à ce qui suit.

"GE" sera donc mis en forme au moyen de HEADER (et ce qui suit aussi). Nous demandons ensuite une taille de police égale à 5 pt, cette taille s'appliquera au 17 que nous souhaitons mettre en exposant.

ok, c'est un peu compliqué... mais ce n'est pas fini parce que le résultat n'est vraiment pas terrible...

certes, le 17 apparaît en plus petit mais il n'est pas assez "haut"... pouvons-nous le rehausser ?

bien entendu...on va pour cela enchainer les ^super...

Code:

ods html close ;
ods html style=breakingbad;
title1 "X puissance Y soit X^{style[fontsize=5pt]^{super 17}}";
title2 "Nicolas Ca^{style header Ge^{style[fontsize=5pt]^{super 17}}}";
title3 "Nicolas Ca^{style header Ge^{style[fontsize=5pt]^{super^{super 17}}}}";
title4 "Nicolas Ca^{style header Ge^{style[fontsize=5pt]^{super^{super^{super 17}}}}}";
title5 "Nicolas Ca^{style header Ge^{style[fontsize=5pt]^{super^{super^{super^{super 17}}}}}}";

proc print;
var actor actor2 ;
run;

on obtient :

http://www.sas-sr.com/img/super3.png

hum... 4 ^super, c'est trop, nous n'en utiliserons "que" 3...

mais il faut maintenant qu'on puisse présenter le numéro associé à chaque élément... et là, c'est un peu coton...

on va commencer par stocker ces numéros dans des macro-variables :

Code:

data _null_;
   set periodic;
   call symputx(symbol,num);
run;

étant donnée notre utilisation de CALL SYMPUTX (voir page 583), nous créons ici des macro-variables qui ont pour nom les noms de nos éléments.

ainsi, il existe une macro-variable GE qui a plus valeur 32 (et non 17 comme dans nos exemples de titres).

Notre étape DATA devient :

Code:

data actor2(keep=actor:);
   set actor;
   if _n_=1 then set periodic2;
   array sy(*) sy: ;
   length actor2 actor3 $ 500 ;
   actor2=actor;
   actor3=actor;
   do i=1 to length(actor)-1;
     do j=1 to dim(sy);
        if lowcase(substr(actor,i,2))=lowcase(sy(j)) then do;
            actor2=tranwrd(actor2,substr(actor,i,2),"^{STYLE HEADER "||compress(sy(j)||'}'));
            actor3=tranwrd(actor3,substr(actor,i,2),"^{STYLE HEADER "||compress(sy(j))||"^{STYLE[FONTSIZE=5pt] ^{SUPER^{SUPER^{SUPER "||symget(sy(j))||"}}}}}");
        end;
   end;
   end;
run;

vous noterez la création d'une nouvelle variable ACTOR3 et nous attribuons maintenant à nos variables ACTOR2 et ACTOR3 une longueur de 500 (les "vraies modalités" derrière ce qui s'affiche peuvent devenir particulièrement longues).

la chose qui doit vous étonner, c'est la présence, dans l'instruction qui modifie la valeur d'ACTOR3 de :

Code:

symget(sy(j))

Nous avons utilisé pour construire nos macro-variables une instruction CALL SYMPUTX ayant la forme :

Code:

CALL SYMPUTX(variable1 , variable2);

au sein d'une étape DATA, pour récupérer les valeurs des macro-variables ainsi créées (voir page 591 ED4), vous utilisez une fonction SYMGET ayant la forme suivante :

Code:

Y=SYMGET(variable1);

Ainsi, si pour une observation, VARIABLE1 a pour modalité GE, vous allez obtenir 32 en modalité de Y.

Notre programme doit demander, si l'on observe la chaine de caractères ge (ou Ge) de retrouver la valeur de la macro-variable GE.

Or, cette variable GE est en fait le jème élément du tableau de variables SY.

oui, je sais, c'est vraiment tordu et je dois vous avouer que je n'avais pas bien réfléchi aux conséquences de mon sujet... voilà ce qui arrive quand on rédige un sujet avant de réfléchir à comment le résoudre...

le résultat ?

http://www.sas-sr.com/img/super4.png

Ce sujet est maintenant terminé (ouf !) - promis, la semaine prochaine, je vous proposerai un nouveau sujet un peu plus facile...

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr
Flux RSS