Fonctions et arguments

Avec ce qui précède, vous devriez être capables de suivre ce qui suit. Nous allons pouvoir commencer à coder.

Dans votre script, saisissez :

seq(from = -10, to = 10, by = 1)

Attention :

1 — R ne lit pas les espaces, les retours à la ligne et les indentations : que vous en utilisiez ou pas dans votre code n’aura aucune incidence sur l’exécution mais rendra vos scripts plus agréables à lire. Par exemple, vous pouvez aussi écrire :

seq(from=-10,to=10,by=1)

2 — R est sensible à la casse : c’est-à-dire que la majuscule et la minuscule d’une même lettre sont pour lui deux choses distinctes. Par exemple, si vous essayez d’exécuter (Ctrl+R ) la ligne suivante :

> Seq(from = -10, to = 10, by = 1)
Erreur : impossible de trouver la fonction "Seq"

Si vous exécutez notre première ligne vous obtenez :

> seq(from = -10, to = 10, by = 1)
 [1] -10  -9  -8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   5   6   7
[19]   8   9  10

Vous venez de faire appel à la fonction seq (pour sequence) qui, comme son nom le suggère, créé des séquences régulières.

Comme toutes les fonctions dans R, elle se présente sous la forme générique :

nom(argument1, argument2, …)

En l’occurrence, vous avez utilisé cette fonction avec trois arguments : from, to et by qui désignent respectivement le point de départ de la séquence que vous souhaitez générer (-10), son point d’arrivé (10) et l’incrément (1).

De la même manière, vous auriez tout aussi bien pu exécuter :

> seq(from = 30, to = 0, by = -5)
[1] 30 25 20 15 10  5  0

Ce qui nous donne une séquence de from = 30 à to = 0 avec un incrément de by = -5.

Cette fonction seq offre d’autres possibilités. Par exemple, vous pouvez générer une séquence d’une longueur déterminée avec l’argument length.out :

> seq(from = 1, to = 30, length.out = 5)
[1]  1.00  8.25 15.50 22.75 30.00

Ce qui nous donne une séquence de from = 1 à to = 30 de longueur length.out = 5.

Vous pouvez aussi combiner from, by et length.out de la manière suivante :

> seq(from = 1, by = 3, length.out = 5)
[1]  1  4  7 10 13

En revanche :

> seq(from = 1, to = 10, by = 3, length.out = 5)
Erreur dans seq.default(from = 1, to = 10, by = 3, length.out = 5) : 
  trop d'arguments

Ce qui, à la réflexion, est évident puisque vous ne pouvez pas créer une séquence régulière qui va de 1 à 10 avec un incrément de 3 et dont la longueur soit de 5.

Si vous souhaitez en savoir plus sur les possibilités offertes par seq, vous pouvez consulter la fonction d’aide de R avec :

> help(seq)

Ou :

> ?seq

En principe, cette commande ouvre une fenêtre dans votre navigateur internet et affiche la page d’aide de la fonction seq.

Que les choses soient dites une bonne fois pour toutes : cette fonction d’aide a été créée par des informaticiens croisés avec des matheux ; raison pour laquelle elle va sans doute vous sembler quelque peu absconse dans un premier temps. N’ayez pas peur ! On s’y fait très bien et vous finirez par apprécier la rigueur avec laquelle elle a été rédigée.

C’est l’occasion de vous montrer deux ou trois petites choses amusantes auxquelles vous serez souvent confrontés.

D’abord, la syntaxe suivante fonctionne très bien :

seq(from = 1,to = 30, length = 5)

Si vous y prêtez attention, j’ai remplacé length.out par length mais R semble avoir très bien compris ce que je voulais faire.

Vous auriez pu aussi écrire :

seq(f = 1, t = 10, l = 5)

C’est-à-dire que, très souvent, vous pouvez abréger le nom des arguments.

Mieux encore, vous n’êtes mêmes pas obligé de nommer les arguments que vous passez à une fonction pourvu que vous les passiez dans le bon ordre. Par exemple, plutôt que :

seq(from = -10,to = 10, by = 1)

Vous avez tout à fait le droit décrire :

seq(-10, 10, 1)

Vous pouvez faire ça parce que vous avez donné vos arguments (from, to et by) dans le bon ordre ; c’est-à-dire l’ordre qui vous est signifié dans la fonction d’aide (from, to, by, length.out et along.with).

Vous pouvez aussi les donner dans le désordre mais dans ce cas il faut les nommer explicitement :

seq(by = 1, from = -10, to = 10)

Sinon :

> seq(1, -10, 10)
Erreur dans seq.default(1, -10, 10) : signe incorrect de l'argument 'by'

R a compris que vous souhaitiez générer une séquence régulière de from = 1 à to = -10 avec un incrément positif de by = 10. Ce qui est idiot : d’où le message d’erreur.

Vous observerez aussi que la plupart des fonctions ont des arguments par défaut. Sur la page d'aide de seq, on vous dit (dans Usage) :

seq(from = 1, to = 1, by = ((to-from)/(length.out-1)),
    length.out = NULL, along.with = NULL, ...)

Ce qui signifie que par défaut, from = 1, to = 1, by est égal à la différence entre to et from divisée par length.out – 1, length.out est NULL (on y reviendra) et along.with) est aussi NULL.

Par exemple, si vous exécutez :

> seq(to = 11, by = 2)
[1]  1  3  5  7  9 11

Votre séquence commence avec la valeur par défaut de from qui est, comme nous venons de le voir, 1.

Certaines fonctions, utilisées dans un contexte particulier, ont donné naissance à des opérateurs. Vous avez déjà vu l’opérateur de l’addition (+) qui fait partie des opérateurs arithmétiques (au même titre que -, *, /, ^ et quelques autres).

Il se trouve qu’il existe aussi un opérateur pour seq, qui fonctionne pour toute séquence de from à to avec by = 1 ou by = -1. Cet opérateur (que nous avons déjà croisé en introduction) c’est : ← il est là !

Démonstration.

En lieu et place de notre :

seq(from = -10,to = 10, by = 1)

Vous pouvez écrire :

> -10:10
 [1] -10  -9  -8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   5   6   7
[19]   8   9  10

Comme précisé ci-dessus : fonctionne aussi dans l’autre sens (c’est-à-dire avec by = -1) :

> 5:-2
[1]  5  4  3  2  1  0 -1 -2

Retenez bien cet animal-là : il va vous être extrêmement utile.

Aucun commentaire:

Enregistrer un commentaire