Pular para o conteúdo principal

Um tutorial sobre loops em R — uso e alternativas

Um tutorial sobre loops em R que apresenta as estruturas disponíveis para repetição. Descubra alternativas com o recurso de vetorização do R.
Atualizado 17 de set. de 2026  · 15 min lido

Explorar com IA

ChatGPTClaudePerplexity

Este tutorial sobre loops em R explora as estruturas disponíveis na linguagem para repetição, quando usá-las e como recorrer a alternativas, como a vetorização do R, para executar suas tarefas de repetição com mais eficiência.

Vamos apresentar alguns exemplos de loops para, em seguida, criticá-los e substituí-los pelas alternativas vetorizadas mais populares entre as muitas disponíveis no rico ecossistema de bibliotecas do R.

Em geral, o conselho deste tutorial é: aprenda sobre loops. Eles dão uma visão detalhada do que deve acontecer no nível elementar e ajudam você a entender os dados que está manipulando.

E, depois que você entender bem os loops, comece a deixá-los de lado.

Invista em aprender alternativas vetorizadas. O ganho de eficiência compensa.

Para praticar de forma interativa, experimente o capítulo sobre loops no nosso curso de Intermediate R.

O que são loops?

“Looping”, “ciclar”, “iterar” ou simplesmente repetir instruções é uma prática antiga, anterior aos computadores. Nada mais é do que automatizar um processo com várias etapas, organizando sequências de ações (processos em lote) e agrupando as partes que precisam ser repetidas.

Todas as linguagens modernas de programação oferecem construções especiais que permitem repetir instruções ou blocos de instruções.

De forma geral, há dois tipos dessas construções (loops) nas linguagens modernas. Alguns loops executam um número prescrito de vezes, controlado por um contador ou índice, incrementado a cada iteração. Eles fazem parte da família for.

Outros loops se baseiam no acionamento e verificação de uma condição lógica. A condição é testada no início ou no fim da estrutura do loop. Essas variantes pertencem às famílias while ou repeat, respectivamente.

Uma introdução aos loops em R

Segundo o manual base do R, entre os comandos de controle de fluxo, as estruturas de loop são for, while e repeat, com as cláusulas adicionais break e next.

Lembre-se de que comandos de controle de fluxo permitem que um programa escolha entre alternativas, ou “tome decisões”, por assim dizer.

Você sempre pode ver esses comandos chamando ?Control na linha de comando do RStudio.

?Control

Este fluxograma mostra as estruturas de loop em R:

fluxograma estruturas de loop em R

Loops for em R

As próximas seções analisam cada uma das estruturas da figura. Vamos começar pela estrutura à esquerda e, em seguida, avançar gradualmente para as estruturas à direita.

Para uma introdução em vídeo a for loops e um exercício prático, experimente o capítulo For Loop no nosso curso de Intermediate R.

Entendendo os for loops

Essa estrutura, formada pelo retângulo de ‘init’ (inicialização), pelo losango de decisão e pelo retângulo i1, é executada um número conhecido de vezes.

Em termos de fluxograma, retângulos significam “faça algo que não envolve decisões”. Losangos (ou rombos) são “símbolos de decisão” e se traduzem em perguntas com duas respostas lógicas possíveis: verdadeiro (T) ou falso (F).

Observação: para simplificar, outros símbolos possíveis foram omitidos da figura.

Uma ou mais instruções dentro do retângulo de inicialização são seguidas pela avaliação de uma condição sobre uma variável que pode assumir valores dentro de uma sequência. No desenho, isso é representado pelo losango: os símbolos significam “o valor atual de v pertence à sequência seq?”.

Em outras palavras, você está testando se o valor atual de v está em um intervalo especificado. Normalmente você define esse intervalo na inicialização, com algo como 1:100, para garantir que o loop comece.

Se a condição não for atendida e o resultado for False, o loop nunca é executado. Isso é indicado pela seta solta à direita da estrutura do for. O programa então executa a primeira instrução após o bloco do loop.

Se a condição for satisfeita, uma instrução — ou bloco de instruções — i1 é executada. E talvez esse bloco seja outro loop. Nesse caso, falamos de loop aninhado.

Feito isso, a condição é novamente avaliada. Isso é indicado pelas linhas que vão de i1 de volta ao topo, logo após a caixa de inicialização. Em R — e em Python — é possível expressar isso em linguagem natural, perguntando se a variável pertence a um intervalo de valores.

Observação: em outras linguagens, como C, a condição é mais explícita com operadores lógicos (maior/menor que, igual a, etc.).

Exemplo simples de for loop:

# Crie um vetor com valores normais aleatórios
u1 <- rnorm(30)
print("Este loop calcula o quadrado dos 10 primeiros elementos do vetor u1")

# Inicialize `usq`
usq <- 0.

for (i in 1:10) {
    # i-ésimo elemento de `u1` ao quadrado na posição i de `usq`
    usq[i] <- u1[i] * u1[i]
    print(usq[i])
}

print(i)

O bloco for fica entre chaves. Elas podem ser colocadas logo após a condição ou na linha de baixo, de preferência com indentação. Nada disso é obrigatório, mas as chaves aumentam a legibilidade do código e facilitam encontrar o bloco do loop e possíveis erros.

Observação: o vetor de quadrados, usq, foi inicializado. Isso não seria necessário em código R puro, mas na versão com marcação, o knitr não compila porque não encontra a referência ao vetor antes do uso, gerando erro no RStudio. Para saber mais sobre knitr, acesse a página do R Markdown.

Aninhando for loops

Agora que você sabe que for loops podem ser aninhados, talvez esteja se perguntando por que e quando usar isso.

Suponha que você queira manipular um arranjo bidimensional definindo seus elementos com valores específicos.

Você poderia fazer algo assim:

# Insira um inteiro
my_int <- 42

nr <- as.integer(my_int)

# Crie uma matriz `n` x `n` com zeros
mymat <- matrix(0, nr, nr)

# Para cada linha e coluna, atribua valores com base na posição
# Esses valores são o produto de dois índices
for (i in 1:dim(mymat)[1]) {
    for (j in 1:dim(mymat)[2]) {
        mymat[i, j] = i * j
    }
}

Dica: para mais informações sobre a função matrix(), visite a R Documentation.

Você tem dois for loops aninhados no código acima e, portanto, dois conjuntos de chaves, cada um com seu bloco e governado pelo seu índice. Ou seja, i percorre as linhas e j percorre as colunas.
 
O que foi produzido?

Você criou a conhecida tabuada de multiplicação — aquela para saber de cor.

Você também pode escolher um inteiro e produzir uma tabela conforme sua escolha: atribua um inteiro a uma variável se a tabela for quadrada ou a duas variáveis se for retangular. Essa(s) variável(is) servirá(ão) como limite superior para os índices i e j.

# Mostre o primeiro bloco 10x10 ou o primeiro bloco `nr` x `nr`
if (nr > 10) {
    mymat[1:10, 1:10]
} else
    mymat[1:nr, 1:nr]

Observação: para evitar que o usuário inunde a tela com tabelas enormes, colocamos uma condição no fim para imprimir apenas o bloco 10 x 10 se o inteiro solicitado for maior que 10. Caso contrário, será impresso um bloco n x n.

O código completo fica assim:

# Insira um inteiro
my_int <- 42

nr <- as.integer(my_int)

# Crie uma matriz `n` x `n` com zeros
mymat <- matrix(0, nr, nr)

Loops while

O loop while, no centro da figura, é composto por um bloco de inicialização, seguido de uma condição lógica. Essa condição geralmente é expressa pela comparação entre uma variável de controle e um valor (maior que, menor que, igual a), mas qualquer expressão que resulte em verdadeiro ou falso é válida.

Se o resultado for False (F), o loop nunca é executado, como indica a seta solta à direita da figura. O programa então executa a próxima instrução após o bloco do loop.

Se for True (T), a instrução ou bloco de instruções i1 é executado.

Note que um bloco adicional i2 foi adicionado: ele atualiza a variável de controle, o que pode alterar o resultado da condição no início do loop (embora não seja obrigatório). Você também pode incrementar um contador para registrar o número de iterações. As iterações cessam quando a condição se torna falsa.

O formato é while(cond) expr, onde cond é a condição a testar e expr é a expressão.

Por exemplo, o loop abaixo pede ao usuário, via uma função definida pelo usuário (UDF), a resposta correta para a pergunta sobre o universo e tudo mais. Ele continuará pedindo até o usuário acertar:

# Sua função definida pelo usuário
readinteger <- function(){
  n <- readline(prompt="Please, enter your ANSWER: ")
}

response <- as.integer(readinteger())

while (response!=42) {   
  print("Sorry, the answer to whatever the question MUST be 42");
  response <- as.integer(readinteger());
}

Primeiro, use uma função definida por você para obter a entrada antes de entrar no loop. Ele continuará enquanto a resposta for diferente de 42.

Em outras palavras, isso evita que o R reclame da expressão ausente que deveria fornecer True ou False — e, de fato, ele não conhece response antes de usá-la no loop. Além disso, se você acertar de primeira, o loop nem será executado.

Loops repeat

O loop repeat fica à extrema direita do fluxograma. É semelhante ao while, mas os blocos i1 e i2 são executados ao menos uma vez, independentemente do resultado da condição.

Em outras linguagens, ele poderia ser chamado de “repeat until” para enfatizar que as instruções i1 e i2 são executadas até que a condição deixe de ser False (ou se torne True), encerrando o loop — mas sempre executando pelo menos uma vez.

Como variação do exemplo anterior, você pode escrever:

readinteger <- function(){
  n <- readline(prompt="Please, enter your ANSWER: ") 
}

repeat {   
  response <- as.integer(readinteger());
  if (response == 42) {
    print("Well done!");
    break
  } else print("Sorry, the answer to whatever the question MUST be 42");
}

Após a função de entrada, você tem o loop repeat cujo bloco executa ao menos uma vez e termina quando a condição do if for satisfeita.

Note que foi preciso definir uma condição dentro do loop para sair com break. Essa cláusula nos leva à noção de interromper ciclos dentro de loops.

Interrupção e saída de loops em R

Como sair de um loop?

Além do fim “natural” — quando você atinge o número prescrito de iterações (for) ou quando a condição é atendida (while, repeat) — é possível parar ou interromper o loop?

E se sim, como?

A instrução break responde à primeira pergunta — vimos isso no exemplo anterior.

Interrompa seus loops com break

Quando o interpretador do R encontra um break, ele passa o controle para a instrução imediatamente após o fim do loop (se houver). No caso de loops aninhados, o break sai apenas do loop mais interno.

Exemplo:

Este trecho define uma matriz m x n de zeros e entra em um for aninhado para preencher as posições, mas somente quando os dois índices diferem. O objetivo é criar uma matriz triangular inferior, isto é, elementos abaixo da diagonal principal são não nulos. Os demais ficam como zero.

Quando os índices são iguais e, portanto, a condição no loop interno (sobre o índice de coluna j) é satisfeita, um break é executado e o loop interno é interrompido, saltando diretamente para a instrução após o loop interno — um print(). Em seguida, o controle volta à condição do for externo (linhas, índice i), que é reavaliada.

Se os índices diferirem, a atribuição é feita e o contador é incrementado em 1. Ao final, o programa imprime o contador ctr, com o número de elementos atribuídos.

# Faça uma matriz triangular inferior (zeros no canto superior direito)
m = 10
n = 10

# Um contador para as atribuições
ctr = 0

# Crie uma matriz 10 x 10 com zeros
mymat = matrix(0, m, n)

for (i in 1:m) {
    for (j in 1:n) {
        if (i == j) {
            break
        } else {
            # atribui valores apenas quando i<>j
            mymat[i, j] = i * j
            ctr = ctr + 1
        }
    }
    print(i * j)
}

# Imprima quantas células foram atribuídas
print(ctr)

Observação: pode ser um pouco zeloso usar chaves mesmo quando não são estritamente necessárias. Fazemos isso para garantir que tudo que abre com { também feche com }. Se notar números não correspondentes de { ou }, há um erro — embora o inverso nem sempre seja verdade!

O uso de next em loops

next descontinua uma iteração específica e salta para o próximo ciclo. Na prática, ele volta para a avaliação da condição do loop atual.

Em outras linguagens, o equivalente pode se chamar “continue” (um pouco confuso), mas significa o mesmo: ao verificar a condição, salte para a avaliação do loop.

Um exemplo simples de manter o loop em execução enquanto descarta um ciclo ao ocorrer certa condição:

m = 20

for (k in 1:m) {
    if (!k %% 2)
        next
    print(k)
}

Esse código imprime todos os números ímpares no intervalo 1:m (aqui, m=20). Em outras palavras, todos os inteiros, exceto aqueles com resto diferente de zero ao serem divididos por 2 (daí o uso do operador módulo %%), conforme especificado no teste do if, serão impressos.

Números cujo resto é zero não serão impressos, pois o programa salta para a avaliação de i in 1:m e ignora quaisquer instruções seguintes. Neste caso, print(k) é ignorado.

Fechando o uso de loops em R

  1. Tente colocar o mínimo de código possível dentro do loop, extraindo o que puder. Lembre-se: tudo que está dentro será repetido várias vezes e talvez não seja necessário.
  2. Cuidado ao usar repeat: garanta uma condição explícita de término ou você pode acabar em um loop infinito.
  3. Se um loop estiver ficando (muito) grande, prefira chamadas de função dentro dele. Isso facilita para outros lerem o código. Mas usar for aninhado para operações de matriz/array provavelmente indica que você não implementou da melhor forma para uma linguagem baseada em matrizes como o R.
  4. Não é recomendado “crescer” uma variável ou dataset atribuindo a cada iteração. Em linguagens como Matlab, isso gera um aviso: você pode continuar, mas é convidado a considerar alternativas. Um exemplo típico aparece a seguir.

Quando usar loops em R

Tudo isso é ótimo, mas quando usar loops em R — e quando evitar?

Toda vez que alguma(s) operação(ões) precisa(m) ser repetida(s), um loop pode ser útil.

Você só precisa especificar quantas vezes ou sob quais condições essas operações devem ser executadas: defina valores iniciais para a variável de controle, rode o loop e, ao final, geralmente faça algo com os resultados.

Mas quando exatamente usar loops?

Você não poderia simplesmente replicar a instrução o número necessário de vezes?

Uma regra prática: se você precisa executar uma ação três vezes ou mais, um loop tende a ser melhor. O código fica mais compacto, legível e fácil de manter, além de economizar digitação: se descobrir que precisa repetir uma vez a mais, basta alterar o valor de uma variável na condição, em vez de reescrever a instrução inteira.

Ainda assim, a natureza particular do R sugere evitar loops(!) sempre que existirem alternativas.

Felizmente, existem alternativas!

O R conta com um recurso que poucas linguagens têm: a vetorização.

Alternativas aos loops em R

O que é vetorização?

Como o nome sugere, vetorização é converter operações repetidas sobre números simples (“escalares”) em operações únicas sobre vetores ou matrizes. Vimos exemplos disso nas seções anteriores.

Um vetor é a estrutura de dados elementar no R e é “uma entidade única composta por uma coleção de coisas”, segundo o manual base.

Logo, uma coleção de números é um vetor numérico.

Ao combinar vetores (do mesmo comprimento), você obtém uma matriz. Isso pode ser feito vertical ou horizontalmente, usando diferentes instruções do R. Assim, no R, uma matriz é vista como uma coleção de vetores horizontais ou verticais. Por extensão, você pode vetorizar operações repetidas em vetores.

Muitas das construções de loop acima podem ser tornadas implícitas usando vetorização.

Digo “implícitas” porque elas não somem de fato. Em nível mais baixo, a forma vetorizada se traduz em código que contém um ou mais loops na linguagem de implementação compilada (Fortran, C ou C++).

Isso fica oculto ao usuário e costuma ser mais rápido que o código R explícito equivalente, mas, a menos que você vá implementar suas próprias funções R nessas linguagens, isso é totalmente transparente para você.

O caso mais simples é a soma de dois vetores v1 e v2 em um vetor v3, que pode ser feita elemento a elemento com um for:

v1 <- c(3,4,5)
v2 <- c(3,4,6)
v3 <- c(0,0,0)
n = length(v1)

for (i in 1:n) {
    v3[i] <- v1[i] + v2[i]
}
v3

Ou você usa a forma vetorizada “nativa”:

v3 = v1 + v2
v3

Observação: dizemos “nativa” porque o R reconhece todos os operadores aritméticos atuando sobre vetores e matrizes.

De modo semelhante, para duas matrizes A e B, em vez de somar elementos A[i,j] e B[i,j] nas posições correspondentes (o que exige cuidar de dois índices i e j), você informa ao R:

A <- matrix(1:6, nrow = 3, ncol = 2)
B <- matrix(c(2,4,3,1,5,7), nrow=3, ncol=2)

C= A + B
C

Simples assim!

Vetorização em R explicada

Por que a vetorização roda mais rápido, se o número de operações elementares parece o mesmo?

A melhor explicação exige olhar os detalhes internos do R (assunto para outro post). Resumindo: em primeiro lugar, R é interpretado e, como tal, todos os detalhes sobre definição de variáveis são tratados pelo interpretador. Você não precisa especificar que um número é ponto flutuante ou alocar memória com ponteiros, por exemplo.

O interpretador do R “entende” essas questões a partir do contexto conforme você digita os comandos, mas faz isso comando a comando. Assim, ele precisa lidar com essas definições toda vez que você emite um comando, mesmo que seja repetido.

Um compilador, por sua vez, resolve todas as definições na compilação de todo o código; o resultado vira binário compacto e otimizado, antes da execução. Agora, como funções R são escritas em linguagens de baixo nível, elas são mais eficientes.

Na prática, ao olhar o código de baixo nível, veríamos chamadas a C ou C++, geralmente dentro de um “wrapper”.

Em segundo lugar, em linguagens que suportam vetorização (como R ou Matlab), toda instrução que usa um dado numérico atua sobre um objeto nativamente definido como vetor, mesmo que tenha um único elemento. Este é o padrão ao definir, por exemplo, uma variável numérica única: sua representação interna no R será sempre um vetor, ainda que com um número só.

Os loops continuam existindo sob o capô, mas no nível compilado e mais rápido (C/C++). A vantagem de trabalhar com vetor é que as definições são resolvidas pelo interpretador uma única vez, sobre todo o vetor, independentemente do tamanho, em contraste com um loop sobre escalares, no qual definições e alocações precisam ser feitas elemento a elemento — e isso é mais lento.

Por fim, lidar com o formato vetorial nativo permite usar rotinas de Álgebra Linear muito eficientes (como BLAS). Assim, ao executar instruções vetorizadas, o R aproveita essas rotinas numéricas. A mensagem é: se possível, processe estruturas inteiras em uma única chamada de função para evitar cópias desnecessárias.

Chega de digressões: vamos a um exemplo geral de vetorização e, na próxima subseção, aprofundamos em funções vetorizadas populares no R para substituir loops.

Um exemplo de vetorização em R

Voltemos à ideia de “fazer dados crescerem”, um jeito tipicamente ineficiente de “atualizar” um data frame.

Primeiro, você cria uma matriz m x n com replicate(m, rnorm(n)), com m=10 vetores coluna de n=10 elementos gerados por rnorm(n).

Depois transforma em data frame (ou seja, 10 observações de 10 variáveis) e realiza uma operação algébrica em cada elemento usando um for aninhado: a cada iteração, uma função senoidal incrementa cada elemento referenciado pelos dois índices.

O exemplo é um pouco artificial, mas poderia representar a adição de um sinal a um ruído aleatório:

# Este é um loop ruim que "faz os dados crescerem"
set.seed(42)
m = 10
n = 10

# Crie matriz de números normais aleatórios
mymat <- replicate(m, rnorm(n))

# Transforme em data frame
mydframe <- data.frame(mymat)

for (i in 1:m) {
  for (j in 1:n) {
    mydframe[i, j] <- mydframe[i, j] + 10 * sin(0.75 * pi)
    print(mydframe)
  }
}

Aqui, a maior parte do tempo de execução é gasta com cópia e gerenciamento do loop.

Veja a solução vetorizada:

set.seed(42)
m = 10
n = 10
mymat <- replicate(m, rnorm(n))
mydframe <- data.frame(mymat)
mydframe <- mydframe + 10 * sin(0.75 * pi)
mydframe

Bem mais simples: a última linha substitui o for aninhado. Observação: usamos set.seed() para garantir resultados idênticos nas duas implementações.

Agora vamos medir o tempo de execução das duas soluções.

Você pode usar comandos do sistema do R, como system.time(), passando um trecho de código assim:

Dica: coloque o código que deseja avaliar entre os parênteses de system.time().

# Insira `system.time()` para medir o loop
for (i in 1:m) {
  for (j in 1:n) {
    mydframe[i, j] <- mydframe[i, j] + 10 * sin(0.75 * pi)
  }
}

# Adicione `system.time()` para medir a execução vetorizada
mydframe <- mydframe + 10 * sin(0.75 * pi) 

No trecho acima, você faz a escolha de m e n, cria a matriz e a transforma em data frame apenas uma vez no início e, depois, avalia o bloco for em comparação com a “one-liner” vetorizada em duas chamadas separadas a system.time().

Mesmo com m=n=10, a versão vetorizada já é cerca de 7 vezes mais rápida — embora, para valores tão baixos, isso pouco importe para o usuário.

As diferenças ficam perceptíveis (a olho nu) com m=n=100, enquanto aumentar para 1000 faz o for parecer travar por dezenas de segundos, e a versão vetorizada ainda executa num piscar de olhos.

Para m=n=10000, o for leva mais de um minuto, enquanto a vetorizada precisa de cerca de 2,54 s. Claro, essas medições variam conforme hardware e software (tente evitar dezenas de abas abertas no navegador e vários apps em segundo plano), mas ilustram bem as diferenças.

Justiça seja feita: aumentar m e n também impacta fortemente a geração da matriz — você pode ver isso envolvendo a função de replicação com outro system.time().

Brinque com m e n para ver como o tempo muda, plotando-o em função do produto m x n. Esse é o indicador relevante, pois expressa a dimensão das matrizes criadas e quantifica o número de iterações necessárias no for aninhado.

Este foi um exemplo de vetorização. Mas há muitos outros. No R News, na página 46, há funções muito eficientes para somas e médias por dimensão em matrizes/arrays: rowSums(), colSums(), rowMeans() e colMeans().

Além disso, a newsletter menciona que “...as funções da família ‘apply’, [s,l,m,t]apply, são fornecidas para aplicar outra função aos elementos/dimensões de objetos. Essas funções ‘apply’ oferecem uma sintaxe compacta para tarefas às vezes complexas, mais legível e rápida que loops mal escritos”.

A família apply: apenas loops ocultos?

A família riquíssima de funções apply é intrinsecamente vetorizada. À primeira vista, parece não conter loops, mas essa característica fica clara ao olhar “por baixo do capô”.

O comando apply (e seus parentes) pertence ao pacote base do R. É composto por várias funções ([s,l,m,r, t,v]apply) para manipular fatias de dados em matrizes ou arrays de forma repetitiva, permitindo atravessar os dados e evitando o uso explícito de loops. As funções atuam em uma matriz/array de entrada e aplicam uma função nomeada, com argumentos opcionais.

Observação: por isso, elas pertencem ao conjunto dos ‘funcionais’ (veja a página de Advanced R de Hadley Wickham).

A função chamada pode ser agregadora (por exemplo, média) ou uma função de transformação/subconjunto.

Vale notar: o uso dessas funções nem sempre leva a execução mais rápida — as diferenças não são enormes; o ganho está em evitar codificar loops trabalhosos, reduzindo chance de erros.

As funções da família são: apply(), sapply(), lapply(), mapply(), rapply(), tapply(), vapply().

Mas quando e como usá-las?

Um pacote como plyr cobre funcionalidades da família; embora decorar todas sem recorrer à documentação seja difícil, essas funções são base para combinações mais complexas e úteis.

As três mais usadas:

  1. apply()

Você quer aplicar uma função às linhas (margem “1”) ou colunas (margem “2”) de uma matriz. Veja esta página para mais detalhes.

  1. lapply()

Você quer aplicar uma função a cada elemento de uma lista e obter uma lista como resultado (daí o “l” no nome). Leia mais na documentação.

  1. sapply()

Você quer aplicar uma função a cada elemento de uma lista, mas deseja um vetor em vez de lista. Saiba mais na documentação.

Funções relacionadas: sweep(), by() e aggregate(), às vezes usadas junto com a família apply().

Vamos limitar aqui à função apply() (uma discussão mais ampla pode ficar para um post futuro).

Dada uma matriz M, a chamada apply(M,1,fun) ou apply(M, 2,fun) aplica a função fun às linhas de M, se a margem for 1; ou às colunas, se for 2. Esse argumento numérico se chama “margin” e é limitado a 1 e 2 porque a função opera em matriz. Em arrays, você pode ter até 8 dimensões.

A função pode ser qualquer função válida do R, inclusive uma função definida pelo usuário (UDF), até mesmo codificada dentro do apply(), o que é prático.

apply(): um exemplo

# defina a matriz `mymat` replicando a sequência `1:5` 4 vezes e transformando em matriz
mymat <- matrix(rep(seq(5), 4), ncol = 5)

# soma por linhas de `mymat`
apply(mymat, 1, sum)

# soma por colunas de `mymat`
apply(mymat, 2, sum)

# Com função definida pelo usuário dentro do apply que soma um número `y` ao total da linha
# `y` definido como `4.5`
apply(mymat, 1, function(x, y)
  sum(x) + y, y = 4.5)

# Ou produza um summary por coluna
apply(mymat, 2, function(x, y)
  summary(mymat))

Você usa data frames com frequência: neste caso, garanta que os dados tenham o mesmo tipo; caso contrário, conversões forçadas de tipo podem ocorrer, o que provavelmente não é o que você quer. Por exemplo, em um data frame misto de texto e números, valores numéricos podem virar strings.

Considerações finais sobre o uso e as alternativas aos loops em R

Nesta jornada, saímos das construções fundamentais de loops na programação até a noção (básica) de vetorização e um exemplo do uso de uma função da família apply(), que aparece com frequência no R.

Em termos de controle de fluxo, lidamos apenas com loops: for, while, repeat e formas de interrompê-los e encerrá-los.

Como as últimas subseções sugerem evitar loops em R, você pode perguntar por que aprendê-los.

Na minha opinião, você deve aprender essas estruturas porque:

  1. É provável que R não seja sua única linguagem na ciência de dados (ou fora dela), e entender construções gerais como loops é útil no seu repertório. A sintaxe varia, mas, dominando-as em uma, você aplica em qualquer outra que encontrar.
  2. O universo R é enorme e é difícil, se não impossível, conhecer todas as funções existentes. Há muitas formas de fazer as coisas — algumas mais eficientes ou elegantes — e sua curva de aprendizado será incremental. Ao usá-las, você começará a buscar jeitos mais eficientes e acabará descobrindo funções novas. Enquanto você lê isto, novas bibliotecas estão sendo criadas e lançadas — conhecer todas é improvável, a menos que você viva como especialista em R.
  3. Por fim, quando não estiver lidando com datasets muito grandes, uma solução com loop pode ser fácil de escrever e ler. E, como cientista de dados, às vezes você precisa prototipar algo pontual que apenas funcione. Talvez não esteja interessado em soluções sofisticadas. Talvez, no fluxo de análise, você só precise demonstrar expertise de domínio e focar no conteúdo. Alguém de back-end vai cuidar da produção (e talvez em outra linguagem!).

Se for loops em R não forem mais um desafio depois deste tutorial, considere o curso Intermediate R da DataCamp. Ele vai fortalecer seu conhecimento com novos exercícios. Se loops já não têm segredos para você, o curso Writing Functions in R, com Hadley e Charlotte Wickham, pode te interessar. Confira também o tutorial For Loops in R.

Execute e edite o código deste tutorial online

Executar código

Perguntas frequentes sobre loops em R

O que são loops em R e por que eles são úteis?

Loops são uma forma de repetir um bloco de código várias vezes. Eles são úteis quando você quer executar a mesma ação em vários pontos de dados ou objetos, ou quando deseja repetir uma ação até que uma certa condição seja atendida.

Quais são os diferentes tipos de loops em R?

Existem dois tipos principais de loops em R: for e while.

  • Loops for repetem um bloco de código para cada item em uma lista ou sequência. Por exemplo, você pode usar um for para imprimir todos os elementos de um vetor ou aplicar uma função a cada elemento de uma lista.
  • Loops while repetem um bloco de código enquanto uma determinada condição for verdadeira. Por exemplo, você pode usar um while para continuar pedindo uma entrada do usuário até que ele forneça uma resposta válida.

Como interromper um loop em R?

Para interromper um loop em R, você pode usar a instrução break. Ela sai imediatamente do loop e continua a execução do restante do código.

Como pular para a próxima iteração de um loop em R?

Para pular para a próxima iteração de um loop em R, você pode usar a instrução next. Ela ignora o restante da iteração atual e segue para a próxima.

Posso colocar loops dentro de outros loops em R?

Sim, você pode colocar loops dentro de outros loops em R. Isso se chama "aninhar" loops. Por exemplo, você pode usar um for dentro de outro for para iterar sobre os elementos de uma matriz.

Tópicos
R
Ciência de dados

Saiba mais sobre R

Curso

Introdução à Escrita de Funções em R

4 h
53.8K
Melhore suas habilidades em R aprendendo a escrever funções eficientes e reutilizáveis.
Ver detalhesRight Arrow
Iniciar Curso
Ver maisRight Arrow
Relacionado

Tutorial

Tutorial sobre loops for em Python

Aprenda a usar loops “for” em Python pra iterar uma sequência ou as linhas e colunas de um DataFrame pandas.
Aditya Sharma's photo

Aditya Sharma

5 min

Tutorial

Tutorial sobre loops em Python

Um tutorial introdutório completo sobre loops em Python. Aprenda e pratique loops while e for, loops aninhados, as palavras-chave break e continue, a função range e muito mais!
Satyabrata Pal's photo

Satyabrata Pal

15 min

Tutorial

Tutorial de Pipes em R para iniciantes

Saiba mais sobre o famoso operador de pipe %>% e outros pipes no R, por que e como você deve usá-los e quais alternativas você pode considerar!
Karlijn Willems's photo

Karlijn Willems

15 min

multiple linear regression

Tutorial

Regressão linear múltipla no R: Tutorial com exemplos

Uma visão geral completa para entender as regressões lineares múltiplas no R por meio de exemplos.
Zoumana Keita 's photo

Zoumana Keita

12 min

Tutorial

Tutorial de regressão linear no R

Neste tutorial, você aprenderá os fundamentos de um modelo estatístico muito popular: a regressão linear.

Eladio Montero Porras

15 min

Tutorial

Pacotes R: Um tutorial para iniciantes

Uma introdução aos pacotes do R com base em 11 das perguntas mais frequentes dos usuários.
DataCamp Team's photo

DataCamp Team

15 min

Ver MaisVer Mais