Expressões e Impressão Automática
R é uma linguagem de expressões: quase toda linha que você escreve produz um valor. No console, uma expressão digitada sozinha é avaliada e seu valor é impresso automaticamente - sem precisar de print():
Cada resultado vem prefixado com [1] - é o R te dizendo a posição do primeiro valor mostrado, uma primeira pista de que o R pensa em vetores (mais abaixo). A impressão automática tem uma pegadinha que vale conhecer no primeiro dia: ela se aplica a expressões isoladas no nível superior. A mesma expressão dentro do corpo de uma função ou de um laço for não imprime nada, e é por isso que scripts usam cat() ou print() explícitos para a saída que você precisa ver.
Atribuição: A Seta
O operador de atribuição do R é <-, uma seta apontando para o nome que recebe o valor:
Leia radius <- 5 como "radius recebe 5". Sim, = também funciona para atribuição no nível superior, e sim, os novatos perguntam por que alguém digitaria dois caracteres em vez de um. A resposta é convenção com dentes: todos os principais guias de estilo, a documentação do R base e efetivamente todo código R que você vai ler usam <- para atribuição, reservando = para um trabalho específico - nomear argumentos dentro de chamadas de função (próxima seção). Seguir a convenção torna as duas operações visualmente distintas. No RStudio, Alt+- (Option+- no macOS) digita a seta por você.
Note que uma atribuição não imprime automaticamente - area <- 78.5 armazena o valor em silêncio. É por isso que o trecho acima precisa do print().
Sensibilidade a Maiúsculas e Minúsculas
O R é estritamente sensível a maiúsculas e minúsculas, tanto nos nomes que você cria quanto nos que a linguagem fornece:
Duas variáveis diferentes. Da mesma forma, mean() é uma função e Mean() não existe. Quando o R te receber com object 'x' not found ou could not find function, cheque a capitalização antes de qualquer outra coisa - é o erro de iniciante mais comum de todos.
Chamadas de Função e Argumentos Nomeados
Funções são chamadas com parênteses, com argumentos separados por vírgulas. Argumentos podem ser correspondidos por posição, por nome, ou uma mistura:
A chamada a seq() mostra a sintaxe de argumentos nomeados do R - e é aqui que o = ganha o seu sustento: dentro de uma chamada, name = value rotula um argumento. Argumentos nomeados te libertam de decorar a ordem dos parâmetros, e tornam as chamadas autodocumentadas; seq(0, 100, 25) funciona de forma idêntica, mas diz menos ao leitor. A convenção de trabalho: passe o primeiro argumento (geralmente os dados) por posição e nomeie o resto.
Obter ajuda sobre qualquer função está a um toque de distância: ?seq no console abre a documentação dela.
Tudo É um Vetor
A ideia que faz o R parecer diferente das outras linguagens: não existem números avulsos. Até 5 é um vetor de comprimento um, e as operações se aplicam elemento a elemento a vetores inteiros:
Nenhum laço em lugar nenhum, e mesmo assim cada elemento foi convertido. Na maioria das linguagens, isso seriam três iterações de um laço for; no R, é aritmética. Isso é a vetorização, e ela molda tudo - operadores de comparação, funções de string e funções matemáticas funcionam todas assim. É por isso que o R idiomático tem muito menos laços do que você esperaria; a história completa está em vetores.
Chaves e Blocos
Corpos de várias linhas - para if, laços e funções - são agrupados com chaves {}:
Duas coisas a notar. A condição fica entre parênteses, e é um if puro, não if: nem if ... then. E, ao contrário do Python, a indentação não carrega significado no R - as chaves definem o bloco, a indentação é para os humanos. Omitir as chaves em blocos de uma linha é legal, mas é uma fonte clássica de bugs de edição; simplesmente use-as sempre.
Espaços em Branco e Ponto e Vírgula
O R ignora espaços em branco extras, e uma nova linha encerra uma instrução - sem necessidade de ponto e vírgula:
A quebra entre linhas funciona porque a linha 3 termina com +, então o R sabe que a expressão não acabou. Essa é a única regra a lembrar ao quebrar linhas longas: quebre depois de um operador ou de uma vírgula, nunca antes, ou o R tratará a primeira linha como completa. O ponto e vírgula existe apenas para espremer duas instruções em uma linha (a <- 1; b <- 2) - legal, desencorajado, facilmente evitável.
Estilo: Como o Código R É Escrito
Além da gramática, o R tem convenções fortes da comunidade (codificadas no guia de estilo do tidyverse, que a maior parte do ecossistema segue):
<-para atribuição,=apenas para argumentos dentro de chamadas.- Nomes em
snake_case:monthly_revenue, nãomonthlyRevenuenemmonthly.revenue. Pontos são legais em nomes no R, mas é melhor evitá-los - eles colidem com um padrão de nomenclatura que as entranhas do R usam. - Espaços ao redor de operadores (
x <- a * 2, nãox<-a*2) e depois de vírgulas. - Indente com quatro espaços dentro das chaves (alguns times usam dois; escolha um e mantenha a consistência).
- Uma instrução por linha.
Nada disso é imposto pelo interpretador. Tudo isso é imposto por qualquer pessoa que leia o seu código. A metade dessa história que trata de nomes continua em variáveis.
O Que Você Leva Daqui
- O R avalia expressões e imprime automaticamente as isoladas no console - mas não dentro de funções ou laços.
- Atribua com
<-("recebe"); use=apenas para nomear argumentos em chamadas de função. - O R é totalmente sensível a maiúsculas e minúsculas - erros de capitalização causam a maioria dos erros iniciais de "not found".
- Tudo é um vetor, e as operações se aplicam elemento a elemento:
c(1, 2, 3) * 2é2 4 6, sem laço. - Chaves definem blocos, novas linhas encerram instruções, e
snake_casemais as convenções de espaçamento fazem seu código ler como o de todo mundo.
A seguir: comentários - como anotar código R e o que fazer quanto à falta de sintaxe de comentário de bloco no R.
Perguntas frequentes
O que significa <- no R?
<- é o operador de atribuição do R: x <- 5 armazena o valor 5 sob o nome x. Leia como 'recebe'. = também atribui no nível superior, mas a convenção da comunidade - imposta por todos os principais guias de estilo - é <- para atribuição e = apenas para nomear argumentos dentro de chamadas de função.
O R diferencia maiúsculas de minúsculas?
Sim, completamente. total, Total e TOTAL são três nomes diferentes, e chamar Mean(x) em vez de mean(x) é um erro, não um aviso. Um erro de 'could not find function' ou 'object not found' é muitas vezes só um erro de digitação de maiúsculas.
Preciso de ponto e vírgula no R?
Não. Uma nova linha encerra uma instrução. Ponto e vírgula só é necessário para espremer duas instruções em uma linha (a <- 1; b <- 2), o que os guias de estilo desencorajam de qualquer forma. Escreva uma instrução por linha e nunca mais pense em ponto e vírgula.
O que significa dizer que o R é vetorizado?
As operações básicas do R funcionam em vetores inteiros de uma vez. c(1, 2, 3) * 2 dá 2 4 6 - a multiplicação se aplica a cada elemento sem nenhum laço. A maior parte do código que seria um laço for em outra linguagem é uma única expressão no R.