Conditions et fonctions
Algo & Prog avec R
A. Malapert, B. Martin, M. Pelleau, et J.-P. Roy 11 septembre 2021
Université Côte d’Azur, CNRS, I3S, France firstname.lastname@univ-cotedazur.fr
Conditionnelle : la prise de décisions if
L’instruction conditionnelleifpermet de prendre une décision.
Dans l’éditeur
a < - -2 i f ( a > 0) {
cat( a ,’ est p o s i t i f \ n ’) } e l s e {
cat( a ,’ est n e g a t i f ou nul \ n ’) }
−−→
RUN -2 est négatif ou nulAu toplevel
C’est moins agréable, il faut faire attention au(x) saut(s) de ligne.
> a < - -2
> i f( a>0) {cat( a ,’ est p o s i t i f \ n ’) }
> e l s e {cat( a ,’ est n e g a t i f ou nul \ n ’) }
−−→
RUN Erreur : ’else’inattendu(e) in "else"
1/15
Bloc et indentation
Syntaxe pour une instruction conditionelle
i f ( c o n d i t i o n ) { b l o c I n s t r u c t i o n s } e l s e {
b l o c I n s t r u c t i o n s }
Indentation
La bonne distance à la marge d’une ligne permet de structurer et de comprendre un programme.
Bloc d’instructions
C’est une suite d’instructions délimitée par des accolades.
a < - -2 i f ( a > 0) {
cat( a ,’ est p o s i t i f \ n ’) } e l s e {
cat( a ,’ est n e g a t i f ou nul \ ’) }
2/15
Attention aux parenthèses et accolades !
Une utilisation correcte des accolades est obligatoire en R Il est nécessaire d’ouvrir et fermer les paires d’accolades : {. . . }.
a < - -2 i f ( a > 0) {
cat( a ,’ est p o s i t i f \ n ’) e l s e {
cat( a ,’ est n e g a t i f ou nul \ n ’) }
−−→
RUN Erreur : ’else’inattendu(e) in "else"
Une utilisation correcte des parenthèses est obligatoire en R Une paire de parenthèses doit toujours délimiter la condition duif: (. . .).
a < - -2 i f a > 0 {
cat( a ,’ est p o s i t i f \ n ’) } e l s e {
cat( a ,’ est n e g a t i f ou nul \ n ’) }
−−→
RUN Erreur : unexpected symbol in "if a"3/15
Opérateurs logiques : ET (&&) et OU (||)
Table de vérité : ces opérateurs ressemblent à ceux de la Logique.
p TRUE TRUE FALSE FALSE
q TRUE FALSE TRUE FALSE
p && q TRUE FALSE FALSE FALSE p || q TRUE TRUE TRUE FALSE
Mais, ils sont court-circuités
> a < - -2
> x = = 3
E r r e u r : o b j e t ’ x ’ i n t r o u v a b l e
> ( a > 0) & & ( x= =3) [1] F A L S E
L’expressionx = = 3 n’a pas été évaluée car FALSE && ? == FALSE La priorité de&&étant plus faible que celle des opérations arithmétiques, on aurait pu écrire :a > 0 & & x = = 3 .
4/15
Liens avec l’électronique numérique
L’opérateur||est aussi court-circuité
> a < - -2
> x = = 3
E r r e u r : o b j e t ’ x ’ i n t r o u v a b l e
> ( a < 0) || ( x= =3) [1] T R U E
carTRUE || ? == TRUE
Portes logiques en électronique
L’opérateur!inverse les valeursTRUE etFALSE. C’est l’inverseur . . . Les constructeurs d’ordinateurs utilisent beaucoup laporte nand.
5/15
Les fonctions prédéfinies de R
Tous les langages de programmation fournissent un large ensemble de fonctions prêtes à être utilisées.
Exemples dans les entiers
> abs(-5) # la f o n c t i o n " v a l e u r a b s o l u e "
5
> ’+’(4 ,9) # l e s op é r a t e u r s s o n t d e s f o n c t i o n s c a c h é es 13
Certaines fonctions résident dans desmodules/packages spécialisés, commeTurtleGraphicsoushiny. . .
> t u r t l e_f o r w a r d ( d i s t=15) # je v e u x r é a l i s e r un g r a p h i s m e t o r t u e
E r r e u r : i m p o s s i b l e de t r o u v e r la f o n c t i o n " t u r t l e_f o r w a r d "
> l i b r a r y( T u r t l e G r a p h i c s ) # il f a u t c h a r g e r l ’ e x t e n s i o n
> t u r t l e_i n i t ()
> t u r t l e_f o r w a r d ( d i s t=15)
6/15
Comment définir une nouvelle fonction ?
Syntaxe pour la définition d’une fonction
Une fonction est une routine qui retourne une valeur.
n o m F o n c t i o n < - f u n c t i o n( l i s t e D e P a r a m è t r e s ) { b l o c I n s t r u c t i o n s
r e t u r n( r é s u l t a t F o n c t i o n ) }
Le motreturnsignifie "le résultat est . . . ".
Définir la fonctionf(n)→2n−1
> f < - f u n c t i o n( n ) {r e t u r n( 2*n - 1) }
> f (5) [1] 9
Paramètres non typés :nn’est pas forcément un entier.
> f (5.2) # a v e c d e s r é e l s a p p r o c h é s 9.4
> f (c o m p l e x(r e a l = 1 , i m a g i n a r y = 1) ) # a v e c d e s c o m p l e x e s [1] 1+2 i
7/15
Les choix multiples avec if ... else if ... else ...
f < - f u n c t i o n( x ) { i f( x < -1) r e t u r n(-1) e l s e i f( x > 1) r e t u r n(1) e l s e r e t u r n( x )
}
ou de manière équivalente
f < - f u n c t i o n( x ) { i f( x < -1) r e t u r n(-1) e l s e {
i f( x > 1) r e t u r n(1) e l s e r e t u r n( x ) }
}
x y
-1
1 -1 1
8/15
Exemples
Comment (re)définir la valeur absolue ?
Abs < - f u n c t i o n( n ) { i f( n>0) {
r e t u r n( n ) } e l s e {
r e t u r n (-n ) }
}
> cat(’ |-5| v a u t ’, Abs (-5) , ’ \ n ’)
|-5| v a u t 5
Comment (re)définir le maximum ?
Max < - f u n c t i o n( n , m ) { i f( n > m ) {
r e t u r n( n ) } e l s e {
r e t u r n ( m ) }
}
> cat(’ max (-10 , -5) v a u t ’, Max (-10 , -5) , ’ \ n ’)
max(-10 , -5) v a u t -5
9/15
Exemple : année bissextile
Depuis l’ajustement du calendrier grégorien, l’année sera bissextile (elle aura 366 jours, et non 365) :
I si l’année est divisible par 4 et non divisible par 100, ou I si l’année est divisible par 400.
Comment calculer le nombre de jours d’une année ?
J o u r s P a r A n < - f u n c t i o n( n ) {
i f((( n %% 4 = = 0) & & ( n %% 100 ! = 0) ) || ( n %% 400 = = 0) ) { r e t u r n( 3 6 6 )
} e l s e { r e t u r n( 3 6 5 ) }
}
Remarquez l’utilisation correcte des parenthèses.
10/15
Notions élémentaires sur les nombres premiers
Nombre premier
Un nombre premier ne peut être divisé que par lui-même et par 1.
Plus grand commun diviseur (PGCD)
Le PGCD de deux nombres entiers non nuls est le plus grand entier qui les divise simultanément.
Premiers entre eux
on dit que deux entiers sont premiers entre eux si leur plus grand commun diviseur est égal à 1.
Supposons que la fonctiongcd(p, q)existe et renvoie le plus grand diviseur commun des entierspet q(nous la programmerons en TP).
11/15
Composition de fonctions I
Créons une fonctionPremiersEntreEux(p,q)basée sur la fonctiongcd.
P r e m i e r s E n t r e E u x < - f u n c t i o n( p ,q) { i f ( gcd ( p ,q) = = 1) {
r e t u r n( T R U E ) } e l s e {
r e t u r n( F A L S E ) }
}
ou encore
P r e m i e r s E n t r e E u x < - f u n c t i o n ( p ,q) { i f ( gcd ( p ,q) = = 1) {
r e t u r n( T R U E ) }
r e t u r n( F A L S E ) }
Le mot cléreturnprovoque un échappement. Le reste du texte de la fonction est abandonné !
12/15
Composition de fonctions II
Une version qui renvoie directement le résultat de l’évaluation de l’expression.
P r e m i e r s E n t r e E u x < - f u n c t i o n( p ,q) { r e t u r n( gcd ( p ,q) = = 1)
}
Une version encore plus courte qui omet les accolades etreturn.
P r e m i e r s E n t r e E u x < - f u n c t i o n( p ,q) gcd ( p ,q) = = 1
> P r e m i e r s E n t r e E u x (21 ,6) [1] F A L S E
> P r e m i e r s E n t r e E u x (21 ,8) [1] T R U E
Vous voyez qu’il existe différentes manières de coder une fonction. Elles se distinguent par leurefficacité, mais aussi leurélégance.
13/15
Documenter une fonction
Pour l’instant
Ajouter simplement des commentaires au début de la fonction.
P r e m i e r s E n t r e E u x < - f u n c t i o n( p ,q) {
# D é t e r m i n e si d e u x e n t i e r s p et q s o n t p r e m i e r s e n t r e e u x p a r c a l c u l du P G C D.
#
# A r g u m e n t s:
# p un e n t i e r
# q un e n t i e r
#
# R e t u r n s: T R U E si p et q s o n t p r e m i e r s e n t r e eux , et F A L S E s i n o n.
. . . }
En effet, il suffit detaper le nom d’une fonction pour voir son code.
14/15
Consulter la documentation de R
> ?p a s t e # c o n s u l t e r la d o c u m e n t a t i o n d ’ u n e f o n c t i o n C o n c a t e n a t e S t r i n g s
D e s c r i p t i o n:
C o n c a t e n a t e v e c t o r s a f t e r c o n v e r t i n g to c h a r a c t e r .
U s a g e:
p a s t e (. . ., sep = " ", c o l l a p s e = N U L L ) p a s t e 0 (. . ., c o l l a p s e = N U L L )
A r g u m e n t s: . . .
> ??p a s t e # r e c h e r c h e r d a n s la d o c u m e n t a t i o n
15/15
Questions?
Retrouvez ce cours sur le site web www.i3s.unice.fr/~malapert/R
15/15