Universidade Federal do Paraná
Curso de Gradução em Estatística

CE 089 - Estatística Computacional II

http://www.leg.ufpr.br/ce089

Prof. Dr. Walmes M. Zeviani
Lab. de Estatística e Geoinformação - LEG
Departamento de Estatística - UFPR


Execução condicional e loops

Esse script tem a finalidade de ilustrar, com a finalidade de ser didático, o uso de estruturas de controle de fluxo, os loops e execução condicional.

Toda linguagem de programação possuí loops e execussão condicional. Tais recursos estão presentes inclusive em planilhas eletrônicas, como Gnumeric e Latex.

Nesse script, será feita aplição de regras lógicas, como teste para verificar se um número é igual/menor/maior que outro além do emprego de operadores de interseção e união para contruir regras compostas. Caso não esteja familiar com regras lógicas, procure fazer uma revisão antes.


Execução condicional

A estrutura mais simples de execução condicional no R é feita usando o if, que testa se uma condição é atendida (returna o valor lógico TRUE) e então executa o que foi determinado.

if (>condição<){
    >código a ser executado<
}

O código abaixo verifica se x é um número par. Em caso afirmativo, printa uma mensagem.

x <- 10
if (x%%2==0){
    cat("x é par.")
}
x é par.

O teste pode ainda considerar execução de código no caso negativo do teste. No caso, printar mensagem quando o número for ímpar.

x <- 13
if (x%%2==0){
    cat("x é par.")
} else {
    cat("x é ímpar.")
}
x é ímpar.

Muitos testes podem ser aplicados em sequência com código executado para cada um. Observe o código para retornar o menor múltiplo de um número.

x <- 13
if (x%%2==0){
    cat("x é múltiplo de 2.")
} else if (x%%3==0){
    cat("x é múltiplo de 3.")
} else if (x%%5==0){
    cat("x é múltiplo de 5.")
} else {
    cat("x não é múltiplo de 2, 3 ou 5.")
}
x não é múltiplo de 2, 3 ou 5.

Os testes não se restrigemn apenas as lógicas com números. Lógicas podem ser aplicadas a strings também, além de valores de outra classe.

## O usuário.
u <- Sys.info()["user"]
str(u)
 Named chr "walmes"
 - attr(*, "names")= chr "user"
if (u=="walmes"){
    cat("Olá Walmes! Seja bem vindo.")
} else if (u=="fernandomayer"){
    cat("Olá Fernando! Como você está?")
} else {
    cat("Usuário desconhecido.")
}
Olá Walmes! Seja bem vindo.

Quando nos testes com strings as alternativas são muitas, o número de condições cresce e o código fica grande. É mais vantajoso usar outra estrutura de execussão condicional. No R se chama switch mas em outras linguagens pode mudar, como no caso do bash que se chama cases. No código abaixo, após o sinal de igual, as chaves delimitam o código a ser executado se a condição for atendida. A terceira parte é executada quando nenhuma das anteriores é satisfeita, da mesma forma como acontede com o if.

switch(u,
       "walmes"={
           cat("Olá Walmes! Seja bem vindo.")
       },
       "fernando"={
           cat("Olá Fernando! Como você está?")
       },
       {
           cat("Usuário desconhecido.")
       })
Olá Walmes! Seja bem vindo.

Em grande parte dos códigos, as estruturas de excussão condicional tem a finalidade de verificar de todos os valores fornecidos pelo usuários são válidos, por exemplo. Quando os valores informados não são validos, permanecer executando o código pode levar a erros sérios. Sendo assim, é interessante que a execussão seja abortada e o usuário receba uma notificação para então adequar os valores usados, apenas para exemplificar. Existem formar de abortar a execussão do código e enviar mensagens de aviso (warning), notificação (message) e erro (error).


Notificações e interrupimento de execução

No R, a função stop() interrompe a execução da porção de código onde está contida. A função message() é indicada para mensagens de diagnóstico e warning() para avisos. Em todas elas, uma mensagem pode/deve ser emitida.

## A versão do R.
v <- getRversion()

if(v<="3.2.0"){
    stop("Versão do R defasada. Execução interrompida.")
} else {
    message("Versão do R compatível. Execussão permitida.")
}
Versão do R compatível. Execussão permitida.
## Ainda não estamos nessa versão.
if(v<="13.2.0"){
    stop("Versão do R defasada. Execução interrompida.")
} else {
    message("Versão do R compatível. Execussão permitida.")
}
Error in eval(expr, envir, enclos): Versão do R defasada. Execução interrompida.
## Os sistema operacinal.
u <- Sys.info()["sysname"]
if(u=="Linux"){
    message("Sistema operacional Linux. Parábens jovem!")
}
Sistema operacional Linux. Parábens jovem!
u <- Sys.info()["user"]
if(u!="BruceWayne"){
    warning("Fique sabendo que você não é o Bruce Wayne!")
}
Warning: Fique sabendo que você não é o Bruce Wayne!

Loops

for (i in 1:10){
    cat(i, "\t", i^2+1, "\n")
}
1    2 
2    5 
3    10 
4    17 
5    26 
6    37 
7    50 
8    65 
9    82 
10   101 
z <- 0
while (z<100){
    z <- 1.5^z
    print(z)
}
[1] 1
[1] 1.5
[1] 1.837117
[1] 2.106203
[1] 2.349005
[1] 2.592026
[1] 2.860441
[1] 3.189325
[1] 3.644284
[1] 4.382547
[1] 5.911915
[1] 10.99098
[1] 86.18189
[1] 1.499263e+15

Toda execução escrita com for pode ser escrita com while? E o contrário?

z <- 0
repeat {
    z <- 1.5^z
    print(z)
    if (z>=100) break
}
[1] 1
[1] 1.5
[1] 1.837117
[1] 2.106203
[1] 2.349005
[1] 2.592026
[1] 2.860441
[1] 3.189325
[1] 3.644284
[1] 4.382547
[1] 5.911915
[1] 10.99098
[1] 86.18189
[1] 1.499263e+15
options(width=90)
devtools::session_info()
Sys.time()
 setting  value                       
 version  R version 3.2.2 (2015-08-14)
 system   x86_64, linux-gnu           
 ui       X11                         
 language en_US                       
 collate  en_US.UTF-8                 
 tz       Brazil/East                 
 date     2015-10-15                  

 package      * version date       source        
 devtools       1.9.1   2015-09-11 CRAN (R 3.2.2)
 digest         0.6.8   2014-12-31 CRAN (R 3.2.2)
 evaluate       0.8     2015-09-18 CRAN (R 3.2.2)
 formatR        1.2.1   2015-09-18 CRAN (R 3.2.2)
 htmltools      0.2.6   2014-09-08 CRAN (R 3.2.0)
 knitr        * 1.11    2015-08-14 CRAN (R 3.2.2)
 lattice      * 0.20-33 2015-07-14 CRAN (R 3.2.1)
 latticeExtra * 0.6-26  2013-08-15 CRAN (R 3.1.0)
 magrittr       1.5     2014-11-22 CRAN (R 3.2.2)
 memoise        0.2.1   2014-04-22 CRAN (R 3.1.0)
 RColorBrewer * 1.1-2   2014-12-07 CRAN (R 3.2.2)
 rmarkdown    * 0.7     2015-06-13 CRAN (R 3.2.1)
 stringi        0.5-5   2015-06-29 CRAN (R 3.2.2)
 stringr        1.0.0   2015-04-30 CRAN (R 3.2.2)
 yaml           2.1.13  2014-06-12 CRAN (R 3.1.0)
[1] "2015-10-15 18:58:16 BRT"