Equivalente a "arremesso" em R


140

Como alguém "lança" um erro no R? Eu tenho uma função que leva um quadro de dados e alguns nomes de coluna e faz coisas com eles. Se as colunas não existirem, quero que a função pare e pare todas as funções, dependendo dela.

Eu olhei recovere browsee tracebackmas, bem, eles pareciam estar perto, mas não o que eu estou procurando.


2
Certo, recuperação, navegador e rastreamento são para depuração, enquanto os sistemas try / catch são para manipulação de erros no código de produção.
Harlan

20
Eu adoro quando pergunta askers usar o nome da função que está procurando várias vezes em uma pergunta;)
Hadley

Eu acho que há uma razão para esta pergunta ter mais votos positivos do que a resposta principal. Mesmo que essa outra questão seja tecnicamente fora de tópico, é esse tipo de resumo excelente de um tópico desconhecido pelo qual o Stack Overflow é famoso.
Josiah Yoder

Respostas:


113

Veja help(tryCatch):

As condições são sinalizadas por ' signalCondition'. Além disso, as funções
' stop' e ' warning' foram modificadas para também aceitar
argumentos de condição.

e mais tarde em "Veja também":

' stop' e ' warning' condições de sinal e ' try' é essencialmente uma versão simplificada de ' tryCatch'.

então você provavelmente quer stop.


24
Isso funciona perfeitamente. R é tão estranho, sem culpa própria - ele foi projetado muito antes de resolvermos um bom design de linguagem interpretada.
forkandwait

5
Segundo os autores, foi fortemente influenciado pelo Scheme, que é antigo e bom. R é 'lispy', mas com estruturas de dados descoladas. As partes "interessantes" em R provavelmente estão relacionadas a muitas convenções que diferem de outros idiomas, principalmente a família da linguagem C, que também é sintaticamente próxima. Eu acho que porque a linguagem foi desenvolvida por um monte de estatísticos que precisavam de uma boa ferramenta, em vez de desenvolvedores que precisavam de uma boa ferramenta. Apenas o fato de o 'ponto' ser apenas um personagem demorou muito tempo para ser
absorvido

5
Alguns exemplos básicos aqui seriam ótimos, não apenas com citações. Aqui stackoverflow.com/a/23917007/54964
Léo Léopold Hertz 준영

Cheguei a essa pergunta ao pesquisar como retroceder um erro no R com uma mensagem de erro mais séria, mas mantendo o rastreio intacto (como em, você executa traceback()após o erro para ver o que deu errado). Usar stopno errorargumento de tryCatchirá atrapalhar o rastreamento. No entanto, o finallyargumento permitirá lançar uma mensagem adicional e manter o rastreamento útil. Não exatamente sobre o assunto, mas acho importante o suficiente para justificar alguns desvios e uma ameaça de moderação, expulsando esse comentário pela janela. :-)
Mali Remorker


8

Além das funções básicas mencionadas por Dirk:

O pacote R.oo possui uma funcionalidade adicional de manipulação de exceções, incluindo uma função throw () que é muito útil. Você pode capturar exceções com as funções usuais try ou trycatch:

> try(throw("Division by zero.")); print("It's ok!");
Error: [2009-10-22 10:24:07] Exception: Division by zero.
[1] "It's ok!"

Você pode ler mais sobre isso aqui: http://www1.maths.lth.se/help/R/R.oo/


8
Ele Ele. R não é funky o suficiente sem OO? Desculpe ser flip, e definitivamente obrigado pela resposta interessante, mas eu irei com a simples parada antiga () acima.
forkandwait

1
Há ainda mais OO agora. :)
Iterator

3
@ws. O que há de tão descolado no R? plotplota uma função, try stop warntudo funciona como você esperaria, e quase tudo o que eu quero fazer é uma linha.
Isomorphismes

4
Frequentemente, o "poder de uma linha" não é uma boa métrica para um idioma. Para muitos de nós, código legível e compreensível supera menos linhas. De fato, muito é ininteligível para mim porque sou iniciante e tento calibrar as expectativas de acordo. Mas outros idiomas tornam bastante intuitivo passar de 0 a concluir o trabalho. R também parece ter desenvolvido uma cultura de uma linha inteligente, difícil de ler. Eu argumentaria a favor de uma cultura de código no máximo semelhante ao inglês, que geralmente também pode ser uma linha, como Ruby.
Philip

6

Na verdade, a função stopifnoté muito conveniente para implementar verificações de integridade no seu código. Ele pega várias expressões lógicas e retorna um erro se alguma delas for avaliada como falsa.

Exemplo: para verificar se a coluna 'c' existe no dataframe 'df':

df <- data.frame(a = numeric(), b = numeric())
stopifnot(!is.null(df$c))

Isso lançará o seguinte erro:

Error: !is.null(df$c) is not TRUE

Soa como o Python assert(...)...
Josiah Yoder

1

Você pode verificar se a coluna existe e fazer o que quiser.
Suponha um data.framenome df1e verifique se col1existe uma coluna :

if(! any(grepl('^col1$',colnames(df1)))) stop("nonexistent column")

ou

if(! any(grepl('^col1$',colnames(df1)))) return(-1)

Por exemplo

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.