2015-07-15 3 views
1

У меня есть следующий код:функция трассировки, которая объявлена ​​внутри другой функции

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() 

я ожидаю выход, как это:

> 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 

Но получить такой результат:

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

Можно ли получить вывод, который я ожидаю? Как я могу исправить код выше?

ответ

3

Вы должны указать среду, в которой вызывается функция в trace. Просто укажите его в аргументе where следа в определении 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() 
} 

И по телефону abc, вы получите ожидаемый результат:

#>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 
Смежные вопросы