9 Introdução aos loops

Os loops em R são muito utilizados na construção de packages, entretanto, podem ser aplicados de diversas formas. Nesta seção iremos abordar os comandos if(), else(), ifelse() e for().




9.1 Comando if e else


O comando if indica a expressão “se,” ou seja, irá retornar uma saída apenas se a condição for atendida.

O comando else indica a expressão “do contrário,” ou seja, se a condição não for atendida.



Vejamos um exemplo:

Queremos testar se x é maior que 0. Vamos adotar em um primeiro caso que x é 10, dessa forma temos:

x=10
if(x<0){"Menor"}else{"Maior"} 
## [1] "Maior"


Agora iremos adotar que x é -10, dessa forma temos:

x=-10
if(x<0){"Menor"}else{"Maior"} 
## [1] "Menor"




9.1.1 Exemplo aplicado à estatística experimental


Considere um experimento em delineamento inteiramente casualizado em que o conjunto de dados foi simulado. Foi utilizado cinco tratamentos e quatro repetições, totalizando 20 parcelas.

set.seed(1) # vamos fixar o conjunto de dados simulados para obter os mesmos valores
resp=rnorm(20,50,4) # 20 observações de média 50 e desvio-padrão 4
trat=rep(c(paste("T",1:5)),e=4); trat=as.factor(trat)


Vamos criar o modelo da análise de variância:

modelo=aov(resp~trat)



Vamos testar a normalidade dos erros e nomear como norm

norm=shapiro.test(modelo$residuals)
norm$p.value # extraindo p-valor
## [1] 0.752246



Vamos usar o if e else para caso a pressuposição não seja rejeitada, irá retornar a análise de variância, do contrário irá retornar "Erros não seguem distribuição normal". Dessa forma, temos:

if(norm$p.value>0.05){anova(modelo)}else{"Erros não seguem distribuição normal"}
## Analysis of Variance Table
## 
## Response: resp
##           Df  Sum Sq Mean Sq F value Pr(>F)
## trat       4  44.104  11.026  0.7897 0.5497
## Residuals 15 209.442  13.963


Como o p-valor calculado foi maior que 0.05, não rejeitamos a hipótese nula que os erros seguem distribuição normal e dessa forma, retornou-se a análise de variância. Entretanto, de forma didática, vamos modificar o p-valor da normalidade dos erros e solicitar novamente o loop. Dessa forma, temos que:

norm$p.value=0.0001 # Vamos alterar o valor de p para 0.0001 (De forma didática, jamais fazer isso!!!)
if(norm$p.value>0.05){anova(modelo)}else{"Erros não seguem distribuição normal"}
## [1] "Erros não seguem distribuição normal"


Assim, como p-valor foi menor que 0.05, o R irá retornar a opção else.




9.2 Comando ifelse


Considere o mesmo exemplo da seção anterior.

set.seed(1) # vamos fixar o conjunto de dados simulados para obter os mesmos valores
resp=rnorm(20,50,4) # 20 observações de média 50 e desvio-padrão 4
trat=rep(c(paste("T",1:5)),e=4); trat=as.factor(trat)


Vamos criar o modelo da análise de variância e testar a normalidade dos erros:

modelo=aov(resp~trat)
norm=shapiro.test(modelo$residuals)

O Comando ifelse é a união dos comandos if e else. O primeiro argumento é a pargunta, o segundo argumento é a saída de if e o terceiro é a saída de else. Vamos gerar a saída de if como sendo "Erros seguem distribuição normal" e a saída de else como "Erros não seguem distribuição normal".

ifelse(norm$p.value>0.05, "Erros seguem distribuição normal","Erros não seguem distribuição normal")
## [1] "Erros seguem distribuição normal"




9.3 Comando for


Chamando o conjunto de dados através do comando for()

set.seed(1)
x=rnorm(10,0,1)
for(i in x){print(i)}
## [1] -0.6264538
## [1] 0.1836433
## [1] -0.8356286
## [1] 1.595281
## [1] 0.3295078
## [1] -0.8204684
## [1] 0.4874291
## [1] 0.7383247
## [1] 0.5757814
## [1] -0.3053884



Somando cada observação a um valor constante

set.seed(1)
x=rnorm(10,0,1)
for(i in x){result=i+1
            print(result)}
## [1] 0.3735462
## [1] 1.183643
## [1] 0.1643714
## [1] 2.595281
## [1] 1.329508
## [1] 0.1795316
## [1] 1.487429
## [1] 1.738325
## [1] 1.575781
## [1] 0.6946116



Solicitando se cada valor é maior ou menor que zero

set.seed(1)
x=rnorm(10,0,1)
for(i in x){result=if(i<0){"Menor"}else{"Maior"}
            print(result)}
## [1] "Menor"
## [1] "Maior"
## [1] "Menor"
## [1] "Maior"
## [1] "Maior"
## [1] "Menor"
## [1] "Maior"
## [1] "Maior"
## [1] "Maior"
## [1] "Menor"