Universidade Federal do Paraná
Curso de Gradução em Estatística
Prof. Dr. Walmes M. Zeviani
Lab. de Estatística e Geoinformação - LEG
Departamento de Estatística - UFPR
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.
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).
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!
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 comwhile
? 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"