Переместить рамку, отладить среду R

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

Вот пример:

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

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

Спасибо

Ответы

Ответ 1

В терминологии 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() 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)).

Ответ 2

Вы можете использовать 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]>