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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top