2015-07-15 1 views
1

Je le code suivant:fonction Trace qui est déclarée dans une autre fonction

abc <- function() { 
    def <- function() { } 
    def_enter <- function() { print("def_enter") } 
    def_exit <- function() { print("def_exit") } 
    trace(def, def_enter, exit = def_exit) 
    def() 
} 

abc_enter <- function() { print("abc_enter") } 
abc_exit <- function() { print("abc_exit") } 

trace(abc, abc_enter, exit = abc_exit) 

abc() 

je me attends à la sortie comme ceci:

> abc() 
Tracing abc() on entry 
[1] "abc_enter" 
Tracing def() on entry 
[1] "def_enter" 
Tracing def() on exit 
[1] "def_exit" 
Tracing abc() on exit 
[1] "abc_exit" 
NULL 

Mais obtenir cette sortie:

> abc() 
Tracing abc() on entry 
[1] "abc_enter" 
Tracing function "def" in package "base" 
Tracing abc() on exit 
[1] "abc_exit" 
NULL 

Est-il possible d'obtenir une sortie à laquelle je m'attends? Comment je peux réparer le code ci-dessus?

Répondre

3

Vous devez spécifier l'environnement dans lequel la fonction trace est appelée. mentionne Il suffit de l'argument where de trace dans la définition de abc:

abc <- function() { 
    def <- function() { } 
    def_enter <- function() { print("def_enter") } 
    def_exit <- function() { print("def_exit") } 
    trace(def, def_enter, exit = def_exit, where=environment()) 
    def() 
} 

Et en appelant abc, vous obtiendrez le résultat escompté:

#>abc() 
#Tracing abc() on entry 
#[1] "abc_enter" 
#Tracing function "def" in package ".GlobalEnv" 
#Tracing def() on entry 
#[1] "def_enter" 
#Tracing def() on exit 
#[1] "def_exit" 
#Tracing abc() on exit 
#[1] "abc_exit" 
#NULL