2015-07-17 2 views
1

(sur le langage R)R: définir une fonction dans une fonction

J'essayais de déclarer/définir une fonction, dans une autre fonction. Cela ne semble pas fonctionner. Je ne pense pas que ce soit exactement un bug, c'est probablement un comportement attendu, mais je voudrais comprendre pourquoi! Toute réponse liée à des pages de manuel pertinentes est également la bienvenue.

Merci

code:

fun1 <- function(){ 
    print("hello") 
    fun2 <- function(){ #will hopefully define fun2 when fun1 is called 
    print(" world") 
    } 
} 

fun1() #so I expected fun2 to be defined after running this line 
fun2() #aaand... turns out it isn't 

Exécution:

> fun1 <- function(){ 
+ print("hello") 
+ fun2 <- function(){ #will hopefully define fun2 when fun1 is called 
+  print(" world") 
+ } 
+ } 
> 
> fun1() #so I expected fun2 to be defined after running this line 
[1] "hello" 
> fun2() #aaand... turns out it isn't 
Error : could not find function "fun2" 
+0

Pourquoi voulez-vous faire, par opposition à la définition d'une fonction unique qui a une dépendance (ie appelle) une autre fonction? –

+2

c'est un comportement normal. 'fun2' est défini dans l'environnement de' fun1' tandis que 'fun1' est défini dans l'environnement global. C'est pourquoi vous ne pouvez pas appeler directement 'fun2' –

Répondre

2

Cela fonctionne comme prévu, mais est généralement considéré comme une mauvaise pratique dans R:

fun1 <- function(){ 
    print("hello") 
    fun2 <<- function(){ #will hopefully define fun2 when fun1 is called 
    print(" world") 
    } 
} 

où JE <- à <<- dans la ligne 3 de la définition de fonction. Exécution:

> fun1 <- function(){ 
+  print("hello") 
+  fun2 <<- function(){ #will hopefully define fun2 when fun1 is called 
+   print(" world") 
+  } 
+ } 
> 
> fun1() 
[1] "hello" 
> fun2() 
[1] " world" 
+0

Merci. Je n'ai pas pris en compte les étendues variables. – bezout

+2

Ce comportement va vraiment perturber les autres utilisateurs de cette fonction (à condition qu'il y ait d'autres utilisateurs de cette fonction) et - comme mts a commencé la réponse avec - est considéré comme une mauvaise pratique. La réponse de Data Munger est beaucoup plus proche de R et utilisée dans de nombreux paquets. – hrbrmstr

+0

Ok merci pour la perspicacité. Je reprendrai la réponse d'autres DataMunger mais je m'en tiendrai à cette "réponse sélectionnée" parce que mon erreur concernait vraiment les portées variables. – bezout

4

une autre façon, si pour « fun1 » pour revenir une fonction que vous attribuez à « fun2 »:

> fun1 <- function(){ 
+ print("hello") 
+ # return a function 
+ function(){ # function to be returned 
+  print(" world") 
+ } 
+ } 
> fun2 <- fun1() # assign returned function to 'fun2' 
[1] "hello" 
> fun2() 
[1] " world"