218
Le logiciel R - Maˆ ıtriser le langage
> message <- bonjour(message="Bienvenue")
[1] "Bienvenue"
[1] "Bienvenue Pierre !"
> message # Espace de travail de nouveau modifié!
[1] "Bienvenue Pierre !"
Faisons `
a pr´ esent un petit commentaire sur les param` etres de la fonction.
Malgr´ e ce que l’on pourrait penser, les variables nom et message ne sont pas
directement ´ evalu´ ees (initialis´ ees aux valeurs d’appel ou aux valeurs par d´ efaut) avant l’ex´ ecution du corps de la fonction. Leur initialisation n’est faite
que lors de leur premi` ere utilisation dans le corps de la fonction. Rappelons que
la fonction missing() permet de tester si un param` etre formel a ´ et´ e fourni lors
de l’appel de la fonction. Cette fonctionnalit´ e ne peut en effet ˆ etre op´ erationnelle qu’` a la condition de la non-´ evaluation de la liste des param` etres formels
au d´ ebut du corps de la fonction. Dans le mˆ eme ordre d’id´ ee, il est possible,
en d´ ebut du corps de fonction, de r´ ecup´ erer l’appel effectif (avec la liste des
param` etres compl´ et´ ee) via la fonction match.call().
> test.call <- function(aa="titi",...,bb="toto") {
+
print(match.call())}
> test.call(a="toto",b="titi")
test.call(aa = "toto", b = "titi")
Expert
Cette derni` ere cr´ eation de fonction ne semble pas pr´ esenter un grand
int´ erˆ et, mais, lorsque vous deviendrez un d´ eveloppeur confirm´ e en R, vous
verrez peut-ˆ etre comment exploiter le r´ esultat de la fonction match.call().
Sans fournir d’explications, mais pour donner un avant-goˆ ut de ce qu’il est
possible de faire en R, modifions la fonction pr´ ec´ edente afin qu’elle retourne
la liste des param` etres coup´ ee en deux listes : celle (nomm´ ee fonction)
des param` etres effectifs associ´ es ` a des param` etres formels de la fonction et
celle (nomm´ ee divers) des param` etres effectifs compl´ ementaires. Notez au
passage la difficult´ e de la tˆ ache `
a prendre en compte le nommage partiel
des param` etres.
> test.call <- function(aa="titi",...,bb="toto") {
+
args <- as.list(match.call())[-1]
+
dans <- names(args) %in% names(list(...))
+
list(fonction=args[!dans],divers=args[dans])
+ }
> test.call(a="toto",b="titi")
$fonction
$fonction$aa
[1] "toto"
$divers
Le logiciel R - Maˆ ıtriser le langage
> message <- bonjour(message="Bienvenue")
[1] "Bienvenue"
[1] "Bienvenue Pierre !"
> message # Espace de travail de nouveau modifié!
[1] "Bienvenue Pierre !"
Faisons `
a pr´ esent un petit commentaire sur les param` etres de la fonction.
Malgr´ e ce que l’on pourrait penser, les variables nom et message ne sont pas
directement ´ evalu´ ees (initialis´ ees aux valeurs d’appel ou aux valeurs par d´ efaut) avant l’ex´ ecution du corps de la fonction. Leur initialisation n’est faite
que lors de leur premi` ere utilisation dans le corps de la fonction. Rappelons que
la fonction missing() permet de tester si un param` etre formel a ´ et´ e fourni lors
de l’appel de la fonction. Cette fonctionnalit´ e ne peut en effet ˆ etre op´ erationnelle qu’` a la condition de la non-´ evaluation de la liste des param` etres formels
au d´ ebut du corps de la fonction. Dans le mˆ eme ordre d’id´ ee, il est possible,
en d´ ebut du corps de fonction, de r´ ecup´ erer l’appel effectif (avec la liste des
param` etres compl´ et´ ee) via la fonction match.call().
> test.call <- function(aa="titi",...,bb="toto") {
+
print(match.call())}
> test.call(a="toto",b="titi")
test.call(aa = "toto", b = "titi")
Expert
Cette derni` ere cr´ eation de fonction ne semble pas pr´ esenter un grand
int´ erˆ et, mais, lorsque vous deviendrez un d´ eveloppeur confirm´ e en R, vous
verrez peut-ˆ etre comment exploiter le r´ esultat de la fonction match.call().
Sans fournir d’explications, mais pour donner un avant-goˆ ut de ce qu’il est
possible de faire en R, modifions la fonction pr´ ec´ edente afin qu’elle retourne
la liste des param` etres coup´ ee en deux listes : celle (nomm´ ee fonction)
des param` etres effectifs associ´ es ` a des param` etres formels de la fonction et
celle (nomm´ ee divers) des param` etres effectifs compl´ ementaires. Notez au
passage la difficult´ e de la tˆ ache `
a prendre en compte le nommage partiel
des param` etres.
> test.call <- function(aa="titi",...,bb="toto") {
+
args <- as.list(match.call())[-1]
+
dans <- names(args) %in% names(list(...))
+
list(fonction=args[!dans],divers=args[dans])
+ }
> test.call(a="toto",b="titi")
$fonction
$fonction$aa
[1] "toto"
$divers
