Análise de Dados em R (FNDE) - Módulo 2
Allan Vieira
março de 2018
Estruturas mais comuns para construir loops no R:
ESTRUTURA | TAREFA |
---|---|
for | executa um loop n vezes |
while | executa um loop enquanto uma condição é verdadeira |
repeat | executa um loop infinito |
break | para a execução do loop |
next | sai da iteração de um loop |
return | sai de uma função |
pegam uma variável de iteração e atribuem a ela números sucessivos de uma sequência ou vetor;
utilizados percorrer os elementos de um objeto no R, como por exemplo as colunas de uma matriz;
exemplo básico: imprimir na tela os valores que a variável de iteração assumirá a cada “rodada” do loop.
for(i in 1:4){
print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
Funcionamento:
a variável de iteração é a variável i;
o laço pega os valores da sequência de 1 a 4 e vai atribuindo um de cada vez a variável i;
após atribuir o último número da sequência, saímos do loop.
x<-c("a","b","c","d")
for(i in 1:4){
print(x[i])
}
[1] "a"
[1] "b"
[1] "c"
[1] "d"
for(i in seq_along(x)){
print(x[i])
}
[1] "a"
[1] "b"
[1] "c"
[1] "d"
for(letter in x){
print(letter)
}
[1] "a"
[1] "b"
[1] "c"
[1] "d"
Note que os 3 loops têm o mesmo comportamento, embora sejam estruturados de forma diferente;
Isso corrobora a máxima de que podemos fazer a mesma coisa de várias maneiras distintas no R !!
Assim como os ifelse() anihandos do Módulo 1, podemos contruir loops FOR aninhados também;
No exemplo abaixo, utilizaremos dois FOR, um para percorrer as linhas de uma matriz e outro para percorrer as colunas de uma matriz:
m <- matrix(1:6, 2 ,3)
for(i in 1:nrow(m)){
for(j in 1:ncol(m)){
print(m[i,j])
}
}
[1] 1
[1] 3
[1] 5
[1] 2
[1] 4
[1] 6
No R, há três formas básicas para fazer um loop sobre um vetor que servirá como sequência para iteração:
É importante compreender essas 3 opções, pois iremos retomá-las ao falar sobre as funções da família apply na próxima seção.
A primeira normalmente não é uma boa escolha, porque costuma levar a formas ineficientes de salvar o output;
Hadley Wickham (e eu também) sugere a segunda que é a mais comum nas demais linguagens de programação.
count <- 0
while(count < 10){
print(count)
count <- count + 1
}
[1] 0
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
z <- 5
while(z >= 3 && z <= 10){
print(z)
coin <- rbinom(1, 1, 0.5)
if(coin == 1){ ## random walk ou passeio aleatório
z <- z + 1
} else {
z <- z-1
}
}
[1] 5
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 7
[1] 8
[1] 7
[1] 8
[1] 9
[1] 8
[1] 9
[1] 10
Os loops FOR e WHILE são os mais importantes e utilizados;
As demais estruturas serão passadas apenas a título de conhecimento.
A estrutura repeat inicia um loop infinito;
Não é uma estrutura muito utilizada, mas pode ser útil em alguns momentos;
Para sair de um laço do tipo repeat, devemos utilizar o comando “break”:
a <- 0
b <- -3
repeat{
print("FNDE")
if((b - a) > 0){
break
} else {
b <- b+1
}
}
[1] "FNDE"
[1] "FNDE"
[1] "FNDE"
[1] "FNDE"
[1] "FNDE"
Usar “repeat” pod ser perigoso: não há garantias de que o loop repeat atingirá sua condição de parada.
É bom estabelecer um número máximo de iterações (acresecentando um loop for, por exemplo) dentro de repeat e depois verificar se a condição ou convergência foi ou não atingida;
A estrutura next
é utilizada para “pular” a iteração (ou um número de iterações) de um loop. Veja o exemplo:
for(i in 1:10){
if(i <= 6){
# pula as primeiras 6 iterações
next
}
print("FNDE")
}
[1] "FNDE"
[1] "FNDE"
[1] "FNDE"
[1] "FNDE"
Note que utilizamos uma expressão condicional com if, para informamos quantas (ou quais) iterações gostaríamos de pular;
read.table internamente tem uma estrutura parecida para quando desejamos ler um arquivo, mas precisamos pular as “n” primeiras linhas – isso é passado no argumento “skip”.
return
é uma estrutura usada especificamente em funções. Como já vimos, ela sinaliza que a função deve sair e retornar um determinado valor.myfun <- function(argumentos){
# executar algum comando
# (...)
return(objeto_a_retornar)
}
1) Crie os seguintes objetos:
2) Por meio de um laço, crie um programa para obter a classe (class()) de cada um dos objetos presentes na lista que criou. Você pode imprimir os resultados no console ou salvar em um vetor se preferir.
3) Crie 4 matrizes com qualquer tamanho e coloque todas em uma lista. Depois, utilizando laço, extraia somente as colunas pares de cada uma dessas matrizes presentes na lista e salve o resultado em uma nova lista.
DICAS:
OBRIGADO!!