Se estou executando um script R longo da linha de comando (R --slave script.R), como posso fazer com que ele forneça números de linha em erros?
Não quero adicionar comandos de depuração ao script, se possível - só quero que R se comporte como a maioria das outras linguagens de script ...
Respostas:
Isso não fornecerá o número da linha, mas dirá onde a falha ocorre na pilha de chamadas, o que é muito útil:
[Edit:] Ao executar um script da linha de comando, você terá que pular uma ou duas chamadas, consulte traceback () para sessões R interativas e não interativas
Não conheço outra maneira de fazer isso sem os suspeitos de depuração usuais:
Você pode querer olhar para esta postagem relacionada.
[Edit:] Desculpe ... acabei de ver que você está executando isso na linha de comando. Nesse caso, sugiro trabalhar com a funcionalidade de opções (erro). Aqui está um exemplo simples:
Você pode criar um script tão elaborado quanto desejar em uma condição de erro, portanto, você deve apenas decidir quais informações você precisa para depuração.
Caso contrário, se houver áreas específicas com as quais você está preocupado (por exemplo, conectar-se a um banco de dados), envolva-as em uma função tryCatch ().
fonte
options(error=function() { traceback(2); if(!interactive()) quit("no", status = 1, runLast = FALSE) })
(ver comentário de resposta aceita). Acho que faria sentido adicioná-lo à resposta aqui em vez de apenas fornecer um link para outro tópico.Doing
options(error=traceback)
fornece um pouco mais de informação sobre o conteúdo das linhas que levaram ao erro. Ele faz com que um traceback apareça se houver um erro e, para alguns erros, ele tem o número da linha, prefixado por#
. Mas é um acerto ou erro, muitos erros não resultarão em números de linha.fonte
No traceback available
após o erro.O suporte para isso estará disponível em R 2.10 e posteriores. Duncan Murdoch postou recentemente no r-devel em 10 de setembro de 2009 sobre findLineNum e setBreapoint :
fonte
Você faz isso definindo
Eu só me pergunto por que essa configuração não é padrão no R? Deveria ser, como em todas as outras línguas.
fonte
Especificar a opção R global para lidar com erros não catastróficos funcionou para mim, junto com um fluxo de trabalho personalizado para reter informações sobre o erro e examinar essas informações após a falha. Atualmente, estou executando o R versão 3.4.1. Abaixo, incluí uma descrição do fluxo de trabalho que funcionou para mim, bem como alguns códigos que usei para definir a opção de tratamento de erros global em R.
Como eu configurei, o tratamento de erros também cria um arquivo RData contendo todos os objetos na memória de trabalho no momento do erro. Esse dump pode ser lido de volta em R usando
load()
e, em seguida, os vários ambientes que existiam no momento do erro podem ser inspecionados interativamente usandodebugger(errorDump)
.Observarei que consegui obter números de linha na
traceback()
saída de quaisquer funções personalizadas dentro da pilha, mas apenas se usasse akeep.source=TRUE
opção ao chamarsource()
qualquer função personalizada usada em meu script. Sem essa opção, definir a opção de tratamento de erros global conforme abaixo envia a saída completa detraceback()
para um log de erros denominadoerror.log
, mas os números de linha não estão disponíveis.Estas são as etapas gerais que executei em meu fluxo de trabalho e como consegui acessar o despejo de memória e o log de erros após uma falha R não interativa.
Coloquei o seguinte no topo do script principal que estava chamando da linha de comando. Isso define a opção de tratamento de erros global para a sessão R. Meu script principal foi chamado
myMainScript.R
. As várias linhas do código têm comentários após elas descrevendo o que fazem. Basicamente, com esta opção, quando R encontra um erro que disparastop()
, ele criará um arquivo de despejo RData (* .rda) da memória de trabalho em todos os ambientes ativos no diretório~/myUsername/directoryForDump
e também escreverá um log de erro nomeadoerror.log
com algumas informações úteis para o mesmo diretório. Você pode modificar este trecho para adicionar outro tratamento em caso de erro (por exemplo, adicionar um carimbo de data / hora ao arquivo de despejo e nomes de arquivo de log de erro, etc.).Certifique-se de que a partir do script principal e de quaisquer chamadas de função subsequentes, sempre que uma função for originada, a opção
keep.source=TRUE
seja usada. Ou seja, para obter uma função, você usariasource('~/path/to/myFunction.R', keep.source=TRUE)
. Isso é necessário para que atraceback()
saída contenha números de linha. Parece que você também pode definir essa opção globalmente usandooptions( keep.source=TRUE )
, mas não testei isso para ver se funciona. Se você não precisa de números de linha, pode omitir esta opção.Rscript myMainScript.R
. Isso inicia uma nova sessão R não interativa e executa o scriptmyMainScript.R
. O fragmento de código fornecido na etapa 1 que foi colocado na parte superior demyMainScript.R
configura a opção de tratamento de erros para a sessão R não interativa.myMainScript.R
. Isso pode estar no próprio script principal ou em várias funções aninhadas profundamente. Quando o erro for encontrado, o tratamento será executado conforme especificado na etapa 1 e a sessão R será encerrada.errorDump.rda
log de erro denominadoerror.log
são criados no diretório especificado por'~/myUsername/directoryForDump'
na configuração da opção de tratamento de erros global.No seu lazer, inspecione
error.log
para revisar as informações sobre o erro, incluindo a própria mensagem de erro e o rastreamento de pilha completo que levou ao erro. Aqui está um exemplo do log gerado em caso de erro; observe que os números após o#
caractere são os números da linha do erro em vários pontos da pilha de chamadas:Em seu lazer, você pode carregar
errorDump.rda
em uma sessão R interativa usandoload('~/path/to/errorDump.rda')
. Uma vez carregado, chamedebugger(errorDump)
para navegar todos os objetos R na memória em qualquer um dos ambientes ativos. Consulte a ajuda do Rdebugger()
para obter mais informações.Esse fluxo de trabalho é extremamente útil ao executar o R em algum tipo de ambiente de produção onde você tem sessões R não interativas sendo iniciadas na linha de comando e deseja que as informações sejam retidas sobre erros inesperados. A capacidade de despejar memória em um arquivo que você pode usar para inspecionar a memória de trabalho no momento do erro, junto com os números de linha do erro na pilha de chamadas, facilita a depuração post-mortem rápida do que causou o erro.
fonte
Primeiro
options(show.error.locations = TRUE)
e depoistraceback()
. O número da linha de erro será exibido após #fonte