Help me help you: um bestiário para entender erros e pedir ajuda no R

Este é um post convidado, escrito por Maurício Humberto Vancine, ecólogo e doutorando em Zoologia e uma pessoa que entende muito (tipo, muito mesmo) de R, QGIS e coisas relacionadas. Conheci Maurício durante meu doutorado, quando me infiltrei no LEEC (Lab. de Ecologia Espacial e Conservação, na Unesp), e é uma das pessoas a quem recorro quando algo não funciona no meu QGIS ou no meu Linux. Aproveitem a leitura! Ele escreveu um post muito melhor do que eu teria conseguido escrever.

Olá jovens, tudo bom? Conversei com o Pavel há um tempo sobre como pode ser complicado tentar ajudar as pessoas com dificuldades no R. Dessa nossa conversa surgiu a ideia desse post, sobre os principais erros que iniciantes [e mesmo experientes] podem encontrar no R e qual a melhor forma de pedir ajuda.

Bem, antes de mais nada, uma breve apresentação sobre minha pessoa: meu nome é Maurício [Humberto] Vancine, sou ecólogo de formação [fiz graduação em Ecologia], fiz mestrado em Zoologia e atualmente sou doutorando também em Zoologia, tudo pela UNESP, em Rio Claro/SP. Também sou caipira com muito orgulho, nasci no interior de São Paulo, numa cidadezinha chamada Socorro, e morei toda infância na parte rural da cidade. Sou ainda pai do Dudu, companheiro da Japa (Lauren), fã de músicas instrumentais e de jogos de RPG. Se quiserem saber um pouco mais sobre meu trabalho acadêmico ou trocar uma ideia, segue aqui meu site com informações de contato.

Minha história com o R começa em 2011, depois de um curso de 40 horas, de onde eu saí um tanto atordoado e sem saber a placa do caminhão [de informações] que havia me atropelado. Depois desse curso, eu sentei na frente do notebook e estudei com afinco até entender razoavelmente esse troço de programação e linguagem R. Essas apostilas forma fundamentais nesse processo de aprendizado: Prof. Victor Landeiro e a apostila dos Profs. Diogo Provete, Fernando Rodrigues da Silva e Thiago Gonçalves Souza. Atualmente existe material mais atualizado para começar a estudar a linguagem R, principalmente considerando o formato tidyverse (tema para um futuro post talvez), recomendo esses livros: “Ciência de Dados com R” em português e R for Data Science em inglês.

Para quem não conhece o R e está lendo esse post, R é uma linguagem de programação voltada principalmente para a manipulação, visualização e análise de dados. Mais detalhes aqui. Para quem gosta de analisar algo no contexto histórico, a sua história de desenvolvimento pode ser acessada aqui. Ela começa em 1992 e vem sendo desenvolvida até hoje, com a mais recente versão (4.0.2) tendo sido lançada há uns dois meses mais ou menos. De forma bem simples, o R é uma linguagem orientada a objeto, que significa que você não precisa compilar seu código [criar um arquivo executável] para rodar, você vai digitando os comando e ele vai executando ali na tela do seu computador.

Os dados que a linguagem R maneja podem ser simples tabelas vindas de planilhas eletrônicas (Excel ou Calc), ou dados geoespaciais (vetor ou raster), ou ainda dados sonoros, genéticos, imagens de satélite, e tudo mais que você denomine como “dados alguma coisa”, porque com quase toda certeza alguém fez algum pacote (conjunto de funções) para trabalhar com esse formato de dado que você pensou… A linguagem R pode ser instalada no seu notebook através de um software (com o mesmo nome), podendo ser acessado aqui.

Há ainda ferramentas que nos auxiliam a utilizar essa linguagem no nosso computador, como o RStudio. Ele é um Ambiente de Desenvolvimento Integrado (do inglês, Integrated Development Environment – IDE), ou seja, um programa de computador que reúne características e ferramentas de apoio ao desenvolvimento de software, nesse caso de escrita e execução de um script, com integração para visualização de figuras, dentre outras funcionalidades. Vale mencionar que tanto o R quanto o RStudio são softwares open source, ou seja, você não precisa pagar para utilizá-los, o que, aliado a uma comunidade ampla e muito generosa, fez com que o R se popularizasse rapidamente nos últimos 15 anos, principalmente entre os ecólogos e mais recentemente entre os cientistas de dados.

Bem, com o que eu expus até o momento, você deve estar pensando: “poxa, que maravilha essa linguagem e esses softwares que fazem esse monte de coisa, e ainda de graça, perfeito!”. Então meu caro, aí que está o problema: o R é uma linguagem de programação, e a menos que você tenha feito graduação em Ciências da Computação, usar essa ferramenta sem um treinamento formal pode não ser nada trivial… Há uma longa curva de aprendizado, ou seja, você pode levar um longo tempo para aprender como entender a sintaxe da linguagem, muito parecido a aprender um novo idioma. E o que você vai mais se deparar, principalmente no começo, são as insuportáveis e desestimulantes mensagens de ERRO! Daí que vem minha fala nos cursos de R que ministro, de chamar o R de linguagem “orientada a ódio”… (Ou “oRientada a óRdio”, se você for de São Carlos PiracicaRba)

A ideia desse post é justamente tentar orientar os usuários iniciantes dessa linguagem a pedir ajuda às pessoas com mais experiência (que sofreram por mais tempo e que por esse motivo sabem um pouquinho a mais). Vou listar alguns tópicos que lembrei, mas os tipos de erros são infinitos, espero ter coberto grande parte deles. Se você está lendo, seja iniciante ou experiente, deixe nos comentários os pontos que não elenquei e que podemos ajustar e melhorar esse post =]

Principais tipos de erros a serem verificados antes de pedir ajuda

O Prof. Milton Cezar Ribeiro (conhecido como Miltinho e meu orientador), sempre fala que “Precisamos errar mais no R”. Isso é um trocadilho interessante: ‘errar’ tem o sentido de usar mais o R, mas também de cometer mais erros para aprender. Aqui eu faço uma lista dos principais erros e certificações que seria interessante você tentar verificar antes de procurar ajuda de fato.

Esse processo exaustivo e entediante de se forçar a procurar os erros no seu código se chama “debugging” e para mim é o melhor exercício que conheço para aprender a programar no R ou qualquer outra linguagem de programação. Isso é tão massante que criaram tirinhas sobre isso. Rio demais com essas tirinhas, porque me identifico com elas…

Fonte: https://www.monkeyuser.com/2018/debugging/

Antes de me aventurar a descrever esses erros e o que você deve verificar, deixo uma leitura muito legal, que me baseei para escrever essa listagem: o site Troubleshoot in R.

1. Certifique-se que leu e entendeu a mensagem de erro

Ler e entender a mensagem de erro que o R nos devolve no console pode parecer óbvio num primeiro momento, mas geralmente é a última coisa que vejo as pessoas iniciantes fazendo. Eu entendo que as mensagens geralmente não são muito claros num primeiro momento, mas depois que entendemos o que elas querem dizer, geralmente podemos facilmente voltar para o script e tentar achar o motivo do erro.

Aqui eu copio do post acima as principais mensagens de erro e uma tradução livre [Google Tradutor mesmo]:

  • ‘could not find function’. Este erro ocorre quando um pacote R não é carregado corretamente ou devido a um objeto ausente, como erro ortográfico nas funções ou nome do conjunto de dados
  • ‘Error in if’. Geralmente significa a declaração lógica em “if (xxx) { …” não está produzindo um valor lógico.
  • ‘object not found’. Este erro ocorre quando o objeto específico usado no código não existe [está vazio].
  • ‘cannot open the connection’. Pode haver duas razões para estarmos recebendo este erro:
    • A file/connection can’t be opened because R can’t find it (geralmente erro na definição do diretório).
    • Failure in .onLoad() (um pacote não consegue encontrar uma dependência do sistema).
  • “subscript out of bounds”. É provável que esse erro ocorre quando se usa loops aninhados incorretamente no código. Imagino você ter um vetor chamado “vetor” com 10 valores, e tentar acessar vetor[11].
  • ‘non-numeric argument to a binary operator’. Isso acontece quando misturamos diferentes valores de vetor no cálculo, por exemplo: numeric x character.
  • “replacement has”. Este erro ocorre quando se tenta atribuir um vetor de valores a um subconjunto de um objeto existente e os comprimentos não correspondem.

2. Certifique-se que instalou e carregou os pacotes das funções que irá utilizar

Pacotes são coleções de funções que realizam importação, manipulação e visualização de formatos de dados específicos ou que realizam análises específicas. Esse erro é bastante comum. Eu passei a utilizar duas estratégias para evitar esse tipo de erro:

  • inicio meu script sempre listando todos os pacotes que irei utilizar
  • sempre que usar a função de um pacote que carreguei, fazê-lo dessa forma (e.g. car::Anova(), para carregar fazer uma ANOVA). O sinal “::” diz que estou usando a função “Anova()” do pacote “car

3. Certifique-se que definiu o diretório correto de onde quer importar ou exportar seus dados

Esse erro também é muito comum, principalmente de usuários iniciantes. Utilizamos a função setwd(“/home/mude”) para indicar que queremos importar e/ou exportar arquivos para essa pasta: /home/mude. Para verificar se esse é mesmo o diretório que queremos, podemos utilizar a função getwd() para nos retornar o endereço do diretório ou as funções dir() ou list.files() para listar os arquivos na pasta. Há uma versão mais moderna dessa abordagem, que é utilizar o pacote here, seguindo uma ideia de facilitar a reprodutibilidade dos códigos quando enviados para outros usuários.

4. Certifique-se que sua planilha está com separação de decimais e colunas corretos

Esse aqui é um erro sempre complicado… Dependendo do idioma, a separação de decimais e colunas mudam numa planilha eletrônica:

inglês: a separação de decimais é feita por ponto (.) e a separação das colunas é feita por vírgula (,)
português: a separação de decimais é feita por vírgula (,) e a separação das colunas é feita por ponto-vírgula (;)

O R tende a lidar bem com essas diferença e você pode, por exemplo, utilizar a função read.csv() para uma planilha configurada e salva no formato em inglês [decimal – ponto (.) e coluna – vírgula (,)], e a função read.csv2() para uma planilha salva no formato em português [decimal – ponto (.) e coluna – vírgula (,)]. Mas sempre verifique sempre sua planilha antes de importá-la para o R.

Na releitura do Pavel, ele ainda mencionou que uma forma de verificar esse erro, é usando a função str(). Essa função devolve no console a estrutura dos dados, indicando o modo de cada coluna (“numeric”, “character”, “logical”, “factor”, …) e uma amostra dos dados. Se o str() mostra que, por exemplo, aquilo que era para ser “numeric” é “factor”, isso indica que ou o separador decimal está errado, ou que falta um argumento “header = TRUE” na função de importar os dados para garantir que a primeira linha se torne o nome das colunas. Dessa forma, use sempre o str() para conferir seus dados importados, isso é uma forma relativamente rápida e fácil de garantir que os dados foram importados de maneira correta. O Pavel ainda mencionou que grande parte dos erros que pessoas o procuram é por erro de vírgula/ponto e podem ser resolvidos olhando str().

Eu sou um grande fã do tidyverse. Usando o formato de “data frame” como “tibble” facilitar verificar esse tipo de erro, porque o “tibble” já indica o número de linhas e o modo de cada coluna. Além disso, a função glimpse() também devolve a mesma verificação dos dados como a str(), mas num formato que me agrada mais. Mas logo menos devo escrever um post sobre tidyverse e sua revolução sobre o uso da linguagem R.

5. Certifique-se que os arquivos que irão ser importados não estão corrompidos

Esse erro não é tão comum, mas pode acontecer. Geralmente em download ou cópia de arquivos grandes pode haver erros e gerar arquivos corrompidos. Então, se houver erro ao importar um arquivo, importe o mesmo em outros softwares para verificar, como abrir uma planilha eletrônica (Excel ou Calc), arquivos geoespaciais (ArcGIS ou QGIS), e outros formatos em softwares específicos.

6. Certifique-se que não digitou algum comando errado

Ao contrário do anterior, esse erro é um dos mais comuns… Geralmente nome de funções erradas – esquecer letras ou alguma letra maiúscula, esquecer de fechar parênteses ou aspas, esquecer um argumento da função, enfim, os tipos de erros aqui podem ser diversos. Entretanto, no console do R Studio podemos ver esse erro com certa facilidade, porque o R Studio tende a indicar esse tipo de erro nos trazendo que a função não existe ou que faltaram aspas ou parênteses. Outros editores, como o Notepad++ e o SublimeText [este último usado e recomendado por este que vos traz este blog], também têm funções que ajudam a encontrar certos erros no código.

7. Certifique-se que a atribuição foi feita corretamente

Esse é o erro de longe mais comum. Pode ser que atribuímos os dados erroneamente com o mesmo nome, ou que chamamos um objeto com uma letra maiúscula ou equívocos nesse sentido. Eu costumo sempre verificar todas as atribuições que faço, simplesmente repetindo o objeto logo em seguida da atribuição e verificando se a atribuição foi feita corretamente. Por exemplo:

dados <- read.csv(“dados.csv”)
dados

(Pavel complementa: às vezes nós temos um objeto, por exemplo uma planilha com algumas centenas de linhas, que é difícil de ser visualizada no console. Nestes casos, você pode usar comandos como str(dados), View(dados), head(dados), entre outros.)

Isso tende a deixar meus códigos mais extensos, mas garante que todas as atribuições foram feitas corretamente.

8. Certifique-se que a Classe do objeto é a mesma requerida pela função

Esse erro é bastante comum e acredito ser o mais difícil de entender e resolver. Ele exige dois conhecimentos do usuário, que geralmente demoram para serem assimilados pelo usuário iniciante:

  • identificar e saber a classe do objeto
  • classe de entrada do objeto na função

Todo objeto criado a partir da atribuição no R (<-) possui uma classe, e essa classe vai depender geralmente da saída da função que o criou. Por exemplo, quando importamos dados de um .csv para o R, geralmente utilizamos:

dados <- read.csv(“dados.csv”)
dados
class(dados)
“data.frame”

A classe desse objeto “dados” é “data.frame”. Por exemplo, a função ggplot() do pacote ggplot2, exige que a entrada do objeto contendo os dados que irão fazer um gráfico seja um “data.frame”. Logo, se meus dados foram atribuídos a um objeto com a classe “matrix”, terei de utilizar a função as.data.frame() para converter a classe desse objeto para “data.frame” e assim poder usar meus dados na função ggplot().

Como sempre falo nos meus cursos introdutórios: é fundamental estudar e entender as classes dos objetos no R. Uma vez esse passo entendido, fica muito mais fácil utilizar a linguagem. Recomendo esse site para se aprofundar nesse sentido.

Tentando resolver os erros

Muito bem, agora que você entendeu e tentou resolver os erros de todas as formas: verificou os pacotes, verificou o diretório, planilhas, dados, todas as linhas de código, o nome dos objetos atribuídos e a classe desse objeto está correta, e o erro ainda persiste, bem, esse é o momento de ler e procurar pelo mesmo erro que você encontrou.

1. Leia a documentação das funções

A função help() ou simplesmente ? abre uma aba no RStudio ou uma aba no navegador da internet com a página de ajuda daquela função que está devolvendo o erro. Bem jovem, leia. Entenda aquele troço: o Help fornece descrições detalhadas dos tópicos, funções e argumentos do R, logo você deve entender exatamente o que a função faz, quais são os tipos de entradas e o que de ser a saída. Note também que há no final dessa página uma parte do código para você reproduzir. Faço-o, examine e compare.

Além do Help, você pode ler materiais específicos de um pacote através de:

  • Vignettes que possuem um tutorial bastante detalhado de como usar um certo pacote
  • CheatSheets, que são cartões de referências resumindo todas as funções e funcionalidade de um pacote

Faça buscas extensivas no Google e no Stack Overflow

Eu não consigo imaginar minha vida sem o Google. Claro, você pode viver pesquisando em livros e enciclopédias, mas vai demorar mais, muito mais… Logo, ele é uma fonte de busca muito interessante. Entretanto, a quantidade de informações que irão retornar das buscas são inúmeras. Para melhorar esse retorno, use “R” ou “R <pacote>” e a mensagem de erro.

Além disso, há outros sites que podem ser especificamente interessantes, como o RSeek, R FAQ (Frequently Asked Questions on R) e no Stack Overflow.

Para ler mais detalhes sobre como ter ajuda no R, recomendo esta leitura.

Idealmente, como pedir ajuda?

Idealmente, depois de verificar todos os possíveis problemas mais simples, e depois de vasculhar a internet sem sucesso, provavelmente você está com um erro novo… Isso é ótimo e péssimo, ao mesmo tempo: muito provavelmente sua dúvida irá melhorar a comunidade R porque ela ainda não foi encontrada ou solucionada e provavelmente não há uma solução trivial kkk

Nesses casos, a primeira coisa à se fazer antes de pedir ajuda é tentar reproduzir seu erro com uma parte pequena do código e dos dados. Comece um projeto no RStudio totalmente novo e torne-o bem pequeno para que você possa isolar seu erro. Copie o código com a parte de erro do seu projeto existente para reproduzir o erro ou apenas tente codificá-lo do zero, sem todo o excesso de fluência do seu projeto principal. Se você não conseguir reproduzir o erro, terá encontrado uma pista sobre o que está acontecendo com o erro em seu código. Se você PODE reproduzir o erro, ótimo, porque isso o ajudará na próxima etapa.

Há uma série de dicas do próprio R e do Stack Overflow para tornar seu código o mais reprodutível possível, aumentando assim as chances de respostas:

Posting Guide: How to ask good questions that prompt useful answers
How do I ask a good question?
How to make a great R reproducible example
How to create a Minimal, Reproducible Example

Além disso, tente padronizar seu código utilizando o Style Guide do R. Isso também ajuda a tornar os códigos mais reprodutíveis e padronizados por toda a comunidade de usuários de R.

Da mesma forma, monte um conjunto de dois conjuntos de arquivos (script e data), comprima (preferencialmente .zip) e só depois envie para algum conhecido sabichão de R. Isso vai facilitar muito a vida de quem está tentando te ajudar. Lembre-se, prints da tela são apenas imagens, dificilmente é possível fazer “esoterism coding”.

Por fim, mas não menos importante, dê notícias a quem te ajudou! Agradeça enviando um e-mail ou uma mensagem qualquer. Agradeça também nos agradecimentos do seu trabalho. Ajudar pessoas no R é um prazer, porque para mim, é um sinal de superação: “Cara, estou conseguindo ajudar as pessoas num troço que eu não fazia ideia há um tempo”.

Resumo da ópera

O R é uma linguagem de programação open source, destinada principalmente à manipulação, visualização e análises de dados, sejam quais forem [praticamente], com grande popularidade entre ecólogos. Seu aprendizado pode ser extremamente complicado no começo, porque grande parte dos cursos de graduação da área de biológicas não possuem treinamento formal sobre esse tipo de conhecimento. Sendo assim, à medida que iniciamos, nos depararemos com diversos problemas e principalmente mensagens de erros, e provavelmente nosso primeiro ímpeto seja pedir ajuda às pessoas mais experientes. Mas antes, devemos tomar algumas medidas como: entender a mensagem de erro, verificar a instalação e carregamento dos pacotes, conferir o diretório, ver o formato das planilhas, verificar o corrompimento dos dados, procurar por erros no código, conferir o nome dos objetos atribuídos e também se a classe desse objeto está compatível com a entrada na função. Depois disso, se ainda persistirem os erros, devemos ler a documentação disponível para os pacotes que estamos utilizando e/ou ainda, fazer buscas extensivas no Google e Stack Overflow para encontrar erros semelhantes e possíveis soluções. Se nada disso resolver, aí passamos para o passo de pedir ajuda. Antes de mais nada, o ideal é criar uma parte do seu código com o erro e só depois enviar para alguém pedindo ajuda ou postar em fóruns de ajuda, seguindo as recomendações dos mesmos. Por fim, agradeça quem te ajudou, não lhe custa nada e deixa a pessoa que ajudou feliz e sabendo que pôde de fato ajudar.

7 pensamentos sobre “Help me help you: um bestiário para entender erros e pedir ajuda no R

    • Parabéns Mauricio, muito bom, muitas leituras e quantas verdades, tem dias que eu quero desistir do R, mas logo lembro do pontencial dessa ferramenta e volto a luta, muito obrigado por tudo.

      Curtir

      • Olá Vargas, fico feliz que esteja ajudando vc. Cara, o R é troço para se dedicar com uma boa dose de moderação. Tem dias tb que eu apanho demais, e é muito frustrante. E tem dias que me sinto um Elliot (Mr. Robot)… O importante é sempre persistir, pq qnd vc consegue chegar num resultado é muito bacana, mas para mim o principal é a jornada: no processo de resolução vc aprender muito =]

        Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s