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:
=10
xif(x<0){"Menor"}else{"Maior"}
## [1] "Maior"
Agora iremos adotar que x é -10, dessa forma temos:
=-10
xif(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
=rnorm(20,50,4) # 20 observações de média 50 e desvio-padrão 4
resp=rep(c(paste("T",1:5)),e=4); trat=as.factor(trat) trat
Vamos criar o modelo da análise de variância:
=aov(resp~trat) modelo
Vamos testar a normalidade dos erros e nomear como norm
=shapiro.test(modelo$residuals)
norm$p.value # extraindo p-valor norm
## [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:
$p.value=0.0001 # Vamos alterar o valor de p para 0.0001 (De forma didática, jamais fazer isso!!!)
normif(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
=rnorm(20,50,4) # 20 observações de média 50 e desvio-padrão 4
resp=rep(c(paste("T",1:5)),e=4); trat=as.factor(trat) trat
Vamos criar o modelo da análise de variância e testar a normalidade dos erros:
=aov(resp~trat)
modelo=shapiro.test(modelo$residuals) norm
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)
=rnorm(10,0,1)
xfor(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)
=rnorm(10,0,1)
xfor(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)
=rnorm(10,0,1)
xfor(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"