переместить кадр вверх, отладить окружение R - PullRequest
19 голосов
/ 21 марта 2012

При отладке функции я хотел бы перейти к родительскому фрейму и посмотреть на некоторые переменные там.Как мне это сделать?

Вот пример:

f <- function() {
   x <-1
   g(x+1)
}
g <- function(z) {
   y = z+2
   return(y)
}

Затем я отлаживаю обе функции, используя debug("g") и debug("f").Когда я оказываюсь в g на Browser>, я бы хотел вернуться к f, чтобы изучить x.

Спасибо

Ответы [ 2 ]

32 голосов
/ 21 марта 2012

Вы можете использовать recover (часто используется для отладки кода после фактической ошибки, через options(error=utils::recover), но его можно вызвать напрямую).

> f()
debugging in: g(x + 1)
debug at #1: {
    y = z + 2
    return(y)
}
Browse[2]> ls()
[1] "z"
Browse[2]> recover()

Enter a frame number, or 0 to exit   

1: f()
2: #3: g(x + 1)

Selection: 1
Called from: top level 
Browse[3]> ls()
[1] "x"
Browse[3]> x
[1] 1
Browse[3]> 
14 голосов
/ 21 марта 2012

В терминологии R вы хотите исследовать родительский фрейм среды оценки g() (т. Е. Среды, в которой вызывался g).Функции для этого описаны на странице справки для ?sys.parent.

Как только ваш браузер покажет, что вы 'debugging in g(x + 1)', вы можете сделать следующее.(Спасибо Джошуа Ульриху за предложение where помочь найти свое положение в стеке вызовов.)

# Confirm that you are where you think you are
where
# where 1 at #3: g(x + 1)
# where 2: f()

# Get a reference to g()'s parent frame (an environment object)
pframe <- parent.frame()
pframe
# <environment: 0x019b9174>

# Examine the contents of the parent frame
ls(env=pframe)
# [1] "x"

# Get the value of 'x' in the parent frame
get("x", env = pframe)
# [1] 1

РЕДАКТИРОВАТЬ : понять набор функций, описанных в ?sys.parent,вероятно, стоит отметить, что parent.frame() является (в основном) сокращением для sys.frame(sys.parent(1)).Если вы окажетесь в среде оценки дальше вниз по стеку вызовов (как показано, например, where), вы можете получить доступ к средам, которые находятся дальше в резервной копии стека вызовов (скажем, на два шага вверх), либо parent.frame(2) или sys.frame(sys.parent(2)).

...