O curso CS50’s Introduction to Programming with R (CS50R), desenvolvido pela Universidade de Harvard em parceria com o freeCodeCamp e ministrado pelos professores Carter Zenke e Dr. David J. Malan, é uma das referências mais abrangentes para o aprendizado moderno da linguagem R [00:00]. O vídeo completo está disponível no YouTube em:
Abaixo está um artigo técnico completo estruturado em 6 grandes seções (correspondentes a 6 laudas de conteúdo denso e aprofundado), sintetizando as principais dicas, padrões de desenvolvimento, otimizações e conceitos essenciais apresentados ao longo do curso.
Diferente de linguagens de propósito geral como Python ou C, a linguagem R foi projetada desde a sua fundação para o cálculo estatístico, análise e computação gráfica de dados [02:47
]. Ela abstrai estruturas complexas de álgebra linear e manipulação vetorial para oferecer sintaxes nativas focadas na ciência de dados.
O fluxo de trabalho profissional no R gira em torno do RStudio, o ambiente de desenvolvimento integrado (IDE) padrão da indústria [04:31]. O ecossistema do RStudio divide-se em quatro painéis essenciais:
.R) duradouros são escritos, editados e salvos [07:52].R
# Exemplo de criação programática de arquivos no RStudio
file.create("meu_script.R")
Toda operação de leitura e gravação no R toma como referência o Working Directory [07:14].
getwd() para verificar a pasta atual.setwd("caminho/para/pasta") ou crie RStudio Projects (.Rproj) para garantir reprodutibilidade do projeto sem paths absolutos rígidos.Ao contrário do padrão 0-based encontrado em C, Python ou Java, em R o primeiro elemento de uma estrutura sequencial ocupa o índice 1 [01:18:55]. Compreender essa convenção evita erros clássicos de off-by-one ao iterar ou filtrar elementos.
Tudo em R é construído sobre vetores. Um escalar simples é, na verdade, um vetor atômico de comprimento 1. Os vetores podem ser criados com a função de concatenação c():
R
# Criando vetores numéricos e de caracteres
temperaturas <- c(22.5, 19.8, 25.1, 18.0)
cidades <- c("São Paulo", "Rio de Janeiro", "Curitiba", "Belo Horizonte")
Uma das lições mais importantes ressaltadas em Harvard é a Vetorização de Funções [01:08:24]. Em R, operações aritméticas e funções nativas aplicam-se automaticamente a todos os elementos de uma coleção simultaneamente, eliminando a necessidade de escrever laços for lentos e verbosos.
R
# Forma NÃO-vetorizada (Ineficiente no R)
resultado <- numeric(length(temperaturas))
for (i in 1:length(temperaturas)) {
resultado[i] <- temperaturas[i] + 5
}
# Forma Vetorizada (Elegante e Desempenho Nativo)
resultado <- temperaturas + 5
O Data Frame é a estrutura bidimensional central do R para dados heterogêneos (colunas com diferentes tipos de dados) [01:01:32].
$.nrow(), ncol() e dim() [01:22:11].R
# Acessando colunas específicas diretamente
votos$candidato
votos$secao_eleitoral
# Verificando contagens de linhas e colunas
total_linhas <- nrow(votos)
total_colunas <- ncol(votos)
Ao exportar resultados estruturados com write.csv(), uma boa prática fundamental é definir row.names = FALSE [01:18:55
]. Caso contrário, o R adicionará uma coluna implícita com índices numéricos indesejados no arquivo final.
R
# Exportando data frame de forma limpa
write.csv(totais_votos, file = "totais.csv", row.names = FALSE)
factorsPara tratar dados qualitativos ou ordinais (como níveis de escolaridade, faixas etárias ou classificações), o R disponibiliza a estrutura de factors [01:33:43].
R
# Transformando um vetor numérico em fator com rótulos descritivos
respostas <- c(-1, 1, 2, 3, 1, -1)
fatores_respostas <- factor(
respostas,
levels = c(-1, 1, 2, 3),
labels = c("Discordo Totalmente", "Neutro", "Concordo", "Concordo Totalmente")
)
O uso de fatores garante que modelos estatísticos e funções de plotagem reconheçam adequadamente a natureza categórica das variáveis.
O R possui uma sintaxe poderosa para filtragem condicional de linhas e colunas utilizando operadores lógicos (==, !=, >, <, %in%):
R
# Filtrando apenas candidatos com votos acima da média
votos_altos <- votos[votos$total_votos > mean(votos$total_votos), ]
NA)Análises do mundo real frequentemente contêm observações atípicas (outliers) ou dados faltantes [01:42:42].
is.na(x) e o parâmetro na.rm = TRUE em funções de agregação como sum(), mean() e sd().R
# Média ignorando valores ausentes (NAs)
media_limpa <- mean(dados_medidos, na.rm = TRUE)
Reduza o excesso de objetos temporários na memória encadeando chamadas de funções via composição [45:07]:
R
# Entrada direta tratada e convertida para inteiro
idade <- as.integer(readline(prompt = "Digite sua idade: "))
A modularização de código facilita a manutenção e evita duplicações. Em R, funções são objetos de primeira classe assignáveis a variáveis:
R
calcular_imposto <- function(renda, aliquota = 0.15) {
if (renda < 0) {
stop("A renda não pode ser negativa.") # Lançando exceção explícita
}
return(renda * aliquota)
}
apply)A substituição de laços manuais pela família apply (lapply, sapply, apply) é a pedra angular da programação idiomática em R.
lapply(): Aplica uma função a cada elemento de uma lista/vetor e retorna uma lista.sapply(): Simplifica o resultado para um vetor ou matriz sempre que possível.apply(): Opera em margens (linhas 1 ou colunas 2) de matrizes e data frames.R
# Aplicando cálculo de raiz quadrada sobre todos os elementos de uma lista
lista_numeros <- list(a = 1:5, b = 10:15)
resultados_lista <- lapply(lista_numeros, sqrt)
Para criar scripts automatizados à prova de falhas em produção:
stop() para interromper a execução quando precondições críticas forem violadas.warning() para alertas não fatais.tryCatch() para capturar falhas de execução sem derrubar a rotina principal.Popularizado por Hadley Wickham, o conceito de Tidy Data estabelece três regras simples para a estruturação de conjuntos de dados:
%>% e o Native Pipe |>)A legibilidade do código R foi revolucionada com a introdução do operador Pipe. Ele passa o resultado da expressão à esquerda como o primeiro argumento da função à direita, eliminando chamadas aninhadas ilegíveis:
R
# Sem Pipe (Difícil leitura de dentro para fora)
resultado <- summarize(group_by(filter(df, ano == 2026), regiao), media = mean(venda))
# Com Pipe Nativo (|> disponível a partir do R 4.1)
resultado <- df |>
filter(ano == 2026) |>
group_by(regiao) |>
summarize(media_venda = mean(venda, na.rm = TRUE))
ggplot2Para visualização de dados profissional, o pacote ggplot2 implementa a Grammar of Graphics, separando o gráfico em camadas lógicas:
data): O data frame de origem.aes): Associação entre colunas de dados e eixos ($x$, $y$), cores ou tamanhos.geom_*): A representação visual (barras, pontos, linhas, histogramas).R
library(ggplot2)
ggplot(data = temperaturas_df, aes(x = dia, y = temp_fahrenheit)) +
geom_col(fill = "steelblue") +
labs(
title = "Temperaturas Médias em Janeiro",
x = "Dia do Mês",
y = "Temperatura (°F)"
) +
theme_minimal()
testthatGarantir que as funções continuem funcionando corretamente após alterações é fundamental no desenvolvimento de software científico [08:48:01
]. O pacote testthat permite escrever suítes de testes automatizados:
R
library(testthat)
test_that("Cálculo de imposto funciona para valores válidos", {
expect_equal(calcular_imposto(1000, 0.15), 150)
expect_error(calcular_imposto(-500))
})
A transição de escrever meros scripts para construir Pacotes R próprios permite o compartilhamento modular de código com a comunidade ou com a sua equipe [08:45:10].
A estrutura anatômica padrão de um pacote R inclui:
DESCRIPTION: Metadados do pacote (nome, versão, autor, dependências).NAMESPACE: Declaração de funções exportadas para o usuário e importadas de outros pacotes.R/: Diretório contendo exclusivamente os arquivos de código .R com a lógica e as funções.man/: Arquivos de documentação (gerados automaticamente via sintaxe roxygen2).tests/: Testes automatizados criados com testthat.Depois de estruturar o pacote (como o exemplo ducksay demonstrado no CS50R), você pode compilá-lo em um arquivo compactado .tar.gz e instalá-lo diretamente no R Console [08:46:27
R
# Compilando e instalando pacote localmente via Console R
install.packages("ducksay_1.0.tar.gz", repos = NULL, type = "source")
# Carregando o pacote recém-criado
library(ducksay)
As opções para compartilhamento mundial do seu pacote incluem:
devtools::install_github("usuario/repositorio")..tar.gz): Ideal para auditorias e uso interno em corporações.apply / purrr).row.names = FALSE ao exportar arquivos com write.csv() [01:18:55].|>) e organize transformações em etapas encadeadas.ggplot2 para construir gráficos expressivos e reprodutíveis.testthat [08:45:10].Aprenda do zero ao avançado com o método Campo Analítico. Garanta sua vaga!
Quero me inscrever agoraAssine para receber nossas notícias mais recentes por e-mail.