Obtendo o estado de variáveis ??após um erro ocorre no R
Pergunta
Vamos dizer que eu tenho chamado apenas uma função, f
, e ocorreu um erro em algum lugar na função. Eu só quero ser capaz de verificar os valores das diferentes variáveis ??direita antes o erro ocorreu.
Suponha que meu instinto me diz que é um pequeno bug, então eu sou muito preguiçoso para usar debug(f)
e com preguiça de inserir browser()
para a parte da função onde eu acho que as coisas vão mal. E eu sou muito preguiçoso para começar a colocar em declarações print()
.
Aqui está um exemplo:
x <- 1:5
y <- x + rnorm(length(x),0,1)
f <- function(x,y) {
y <- c(y,1)
lm(y~x)
}
Chamando f(x,y)
temos o seguinte erro:
Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) :
variable lengths differ (found for 'x')
Neste exemplo, eu quero agarrar o estado do ambiente, pouco antes lm()
é chamado; Dessa forma eu posso chamar x
e y
e ver que seus comprimentos são diferentes. (Este exemplo pode ser muito simples, mas eu espero que isso tem a idéia do outro lado.)
Solução
Como apontado aqui , há um fácil maneira de fazer isso, e eu acho que esse truque tem o potencial de mudar vidas para melhor.
Em primeiro lugar, chamar este:
options(error=recover)
Agora, quando nós chamamos f(x,y)
teremos a opção de escolher um ambiente para se recuperar. Aqui eu selecionar a opção 1, o que abre um depurador e me deixa brincar com variáveis ??pouco antes lm()
é chamado.
> f(x,y)
Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) :
variable lengths differ (found for 'x')
Enter a frame number, or 0 to exit
1: f(x, y)
2: lm(y ~ x)
3: eval(mf, parent.frame())
4: eval(expr, envir, enclos)
5: model.frame(formula = y ~ x, drop.unused.levels = TRUE)
6: model.frame.default(formula = y ~ x, drop.unused.levels = TRUE)
Selection: 1
Called from: eval(expr, envir, enclos)
Browse[1]> x
[1] 1 2 3 4 5
Browse[1]> y
[1] 1.6591197 0.5939368 4.3371049 4.4754027 5.9862130 1.0000000
Outras dicas
Você também pode simplesmente usar a função debug ():
> debug(f)
> f(x,y)
debugging in: f(x, y)
debug: {
y <- c(y, 1)
lm(y ~ x)
}
Browse[1]>
debug: y <- c(y, 1)
Browse[1]> x
[1] 1 2 3 4 5
Browse[1]> y
[1] 2.146553 2.610003 2.869081 2.758753 4.433881
options(error=recover)
Provavelmente responde à pergunta melhor. No entanto, eu gostaria de mencionar outra ferramenta de depuração útil, traceback()
. Chamar esse direito após a ocorrência de um erro muitas vezes é suficiente para identificar o erro.