Доступ к состоянию функции во время выхода (остановка) - PullRequest
0 голосов
/ 28 мая 2019

Пусть следующая функция:

tmp <- function(x){
      y <- 10
      stop('foo')
    }

На самом деле, это функция, которую я не контролирую; Я не могу изменить его код.

Как мне узнать значение y, как определено в функции, когда stop вызывается программно?

Интерактивно я могу сделать следующее:

options(error = quote(dump.frames("testdump", FALSE)))
tmp()
v <- get("y", testdump[[1]]) 
options(error = NULL)

Я получаю ошибку, но все равно могу получить значение y благодаря dump.frames.

Я читал http://adv -r.had.co.nz / Exceptions-Debugging.html но я, должно быть, пропустил уловку, потому что я не могу заставить это работать программно.

Спасибо!

1 Ответ

0 голосов
/ 28 мая 2019

Если вы запустите следующий код все сразу (поэтому не строка за строкой), он даст вам то, что вы желаете

tmp <- function(x){
  y <- 10
  stop('foo')
}
x= 1
debug(tmp)
tmp(x)
n
n
v <<- y
n

Позвольте мне объяснить, что произошло.debug(tmp) заставляет R запускать интерактивный сеанс отладки, как только вызывается tmp(x).

В нашем случае это всего лишь взлом, чтобы попасть в функциональную среду.В интерактивной ситуации n заставит курсор перейти на следующую строку.Нам нужно пройти две строки вниз, прежде чем мы доберемся до строки, где определен y.

После того, как y = 10 запущен в функции, мы можем присвоить y нашей глобальной среде.Это то, что делает оператор <<-.Он назначает переменную y в функциональной среде переменной v в глобальной среде.

Затем я выбираю выход из интерактивного сеанса, выполняя stop("foo"), но вы также можете сделать что-то еще здесь, чтобы выйти изфункциональная среда, которая зависит от вас.

Если вы хотите увидеть, что происходит, вы можете просто выполнить эту строку построчно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...