La valeur de retour d'une fonction peut être n'importe quel objet R. Bien que la valeur de retour soit souvent une liste, elle pourrait même être une autre fonction.
Vous pouvez transmettre une valeur à l'appelant en appelant explicitement return (). Sans cet appel, la valeur de la dernière instruction exécutée sera renvoyée par défaut. Par exemple, considérons l'exemple oddcount () du chapitre 1:

  1. > oddcount
  2. }
  3. k <- 0 # assign 0 to k
  4. for (n in x) {
  5. if (n %% 2 == 1) k <- k+1 # %% is the modulo operator
  6. }
Source code
Cette fonction renvoie le nombre de nombres impairs dans l'argument. Nous pourrions simplifier légèrement le code en éliminant l'appel à return (). Pour ce faire, nous évaluons l'expression à renvoyer, k, comme notre dernière déclaration dans le code:

  1. oddcount <- function(x) {
  2. k<-0
  3. }
  4. pagebreak
  5. for (n in x) {
  6. if(n%%2==1)k<-k+1
  7. }
  8. k
Source code

D'autre part, considérez ce code:

  1. oddcount <- function(x) {
  2. k<-0
  3. for (n in x) {
  4. if(n%%2==1)k<-k+1
  5. }
  6. }
Source code
Cela ne fonctionnerait pas, pour une raison assez subtile: La dernière instruction exécutée ici est l'appel à for (), qui renvoie la valeur NULL (et le fait, dans le jargon R, invisiblement, ce qui signifie qu'il est rejeté s'il n'est pas stocké par affectation). Ainsi, il n'y aurait pas de valeur de retour du tout.


1 Décider d'appeler explicitement return ()
Le R idiom dominant est d'éviter les appels explicites à return (). L'une des raisons invoquées pour cette approche est que l'appel de cette fonction allonge le temps d'exécution. Cependant, à moins que la fonction ne soit très courte, le temps économisé est négligeable, donc cela pourrait ne pas être la raison la plus convaincante de ne pas utiliser return (). Mais cela n'est généralement pas nécessaire.
Considérons notre deuxième exemple de la section précédente:

  1. oddcount <- function(x) {
  2. k<-0
  3. for (n in x) {
  4. }
  5. if(n%%2==1)k<-k+1
  6. }
  7. k
Source code
Ici, nous avons simplement terminé avec une déclaration listant l'expression à renvoyer - dans ce cas, k. Un appel à return () n'était pas nécessaire. Le code de ce livre inclut généralement un appel à return (), pour plus de clarté pour les débutants, mais il est de coutume de l'omettre.
Une bonne conception de logiciel, cependant, devrait signifier que vous pouvez regarder à travers le code d'une fonction et repérer immédiatement les différents points sur lesquels le contrôle est retourné à l'appelant. La façon la plus simple d'y parvenir consiste à utiliser un appel return () explicite dans toutes les lignes au milieu du code qui provoquent un retour. (Vous pouvez toujours omettre un appel return () à la fin de la fonction si vous le souhaitez.)


2 Retour d'objets complexes
La valeur de retour pouvant être n'importe quel objet R, vous pouvez renvoyer des objets complexes. Voici un exemple de fonction renvoyée:

  1. >g
  2. }
  3. t <- function(x) return(x^2)
  4. > g()
  5. <environment: 0x8aafbc0>
Source code
Si votre fonction a plusieurs valeurs de retour, placez-les dans une liste ou un autre conteneur.