9 Estruturas de Controle

As duas principais vantagens da maioria das linguagens computacionais são:

  • Executar tarefas repetitivas
  • Fazer decisões lógicas

Para executar tarefas repetitivas, vamos criar loopings. É como se o nosso código desse voltas e repetisse de acordo com a regra estabelecida.

Os loopings irão usar as funções for e while.

Para adicionar decisões lógicas ao nosso algoritmo, as principais funções são o if-else e o ifelse.

Existem outras estruturas de controle que não serão abordadas aqui. Porém essas são as mais importantes.

As estruturas de controle podem ser combinadas quando necessário. Ou seja, você pode utilizar a função for juntamente com outra função for. Ou então a função while juntamente com a função if.

Essas combinações irão depender somente da demanda do algoritmo que você precisa desenvolver.

9.1 for

A função for é usada para criar loopings, ou seja, para executar uma tarefa diversas vezes.

Para usar a função for, você precisa criar uma variável para te auxiliar. Essa variável terá o seu valor alterado a cada ciclo de execução do for.

Além disso, essa variável irá percorrer uma sequência, definida por você.

Veja na prática:

Vamos criar um vetor que irá receber o valor do dobro de sua posição. Esse vetor irá ter tamanho igual a 10.

nosso_vetor<-c()     #criei o 'nosso_vetor'
for(posicao in 1:10){ #a nossa variável auxiliar é a 'posicao'. Ela irá percorrer o vetor 1:10.
                      #O vetor 1:10 é a mesma coisa que criar um vetor com todos os números de 1 a 10.
                      #O primeiro valor para a variável 'posicao' será 1, depois 2 até o último valor que é 10.
  nosso_vetor[posicao]<-2*posicao  #O vetor 'nosso_vetor' irá receber o dobro de sua posição.
}
nosso_vetor
##  [1]  2  4  6  8 10 12 14 16 18 20

Outro exemplo:

for(auxiliar in 1:10){
  print(nosso_vetor[auxiliar])
}
## [1] 2
## [1] 4
## [1] 6
## [1] 8
## [1] 10
## [1] 12
## [1] 14
## [1] 16
## [1] 18
## [1] 20

No exemplo acima, a nossa variável auxiliar também irá percorrer a sequência 1, 2, 3, 4, 5, 6, 7, 8, 9 e 10.

A tarefa a ser repetida é imprimir o elemento dentro do ‘nosso_vetor’ que está posicionado no valor da variável ‘auxiliar’. A variável irá percorrer o looping começando com valor igual a 1 e irá até o valor 10.

Ou seja, o que o looping faz é exatamente equivalente ao código:

print(nosso_vetor[1])
## [1] 2
print(nosso_vetor[2])
## [1] 4
print(nosso_vetor[3])
## [1] 6
print(nosso_vetor[4])
## [1] 8
print(nosso_vetor[5])
## [1] 10
print(nosso_vetor[6])
## [1] 12
print(nosso_vetor[7])
## [1] 14
print(nosso_vetor[8])
## [1] 16
print(nosso_vetor[9])
## [1] 18
print(nosso_vetor[10])
## [1] 20

9.2 while

Note que na função for a variável auxiliar segue uma sequência já definida antes do início do looping.

Porém, em alguns casos, vai ser mais interessante manter o looping rodando enquanto alguma condição ainda não foi atendida. Para isso usaremos a função while.

Esse é o caso, por exemplo, de um modelo de previsões que irá sofrer um número indefinido de iterações e só irá encerrar o looping quando o erro for menor do que determinado valor.

i<-0
while(i < 1){
  i<-rnorm(1) #a função rnorm(1) irá gerar 1 número aleatório com a distribuição normal padrão.
  print(i)    #a função print(i) irá imprimir o valor atribuído a i na linha anterior.
}
## [1] -1.548758
## [1] -2.004604
## [1] 0.8997255
## [1] -0.9243321
## [1] 0.9940622
## [1] 2.189697

A condição para o looping acontecer é que o valor de i seja menor do que 1.

A cada nova interação, o valor de i é atualizado por um novo valor.

A função print(i) imprime o valor atribuído ao elemento i.

Então, o looping irá dar voltas enquanto o valor de i for menor do que 1. O último valor impresso é maior do que 1 e isso significa que a condição i < 1 não é mais atendida, portanto, o looping irá se encerrar.

9.3 if - else

As funções for e while são úteis para criarmos loopings e repetir determinada tarefa. Já as funções if ou ifelse são funções de decisões lógicas.

Ou seja, você irá estabelecer uma condição e, caso ela seja atendida, o código será executado.

Caso a condição estabelecida seja atendida (TRUE), será seguido o roteiro estabelecido quando a condição for verdadeira. Caso a condição não seja atendida (FALSE), será seguido outro roteiro.

Nesse item, vamos utilizar as funções if e else separadas, primeiro uma e depois a outra.

O exemplo abaixo, vamos criar a condição lógica a < b. Portanto, se a for menor que b, a condição lógica será verdadeira e a parte seguinte do código será executada:

a<-2
b<-5
if(a < b){
  print("Condição verdadeira. 'a' é menor que 'b'")
}
## [1] "Condição verdadeira. 'a' é menor que 'b'"

Agora, vamos adicionar a função else que é simplesmente o SENÃO. Caso a condição lógica seja FALSA, o script contido dentro da função else é executado.

if(a > b){ #a condição lógica foi invertida e será FALSA
    print("Condição verdadeira. 'a' é maior que 'b'")
}else{
      print("Condição falsa. 'a' não é maior que 'b'")
}
## [1] "Condição falsa. 'a' não é maior que 'b'"

O uso da função else é opicional. Caso ela não esteja presente, nada irá acontecer quando a condição lógica não for atendida.

Repare que as duas formas apresentadas seguem os padrões:

## if
if(condicao_logica){ #a condição lógica deve ser sempre TRUE ou FALSE
  #SCRIPT CASO A CONDIÇÃO FOR ATENTIDA
}
## if - else
if(condicao_logica){ #a condição lógica deve ser sempre TRUE ou FALSE
  #SCRIPT CASO A CONDIÇÃO FOR ATENTIDA (TRUE)
}else{
    #SCRIPT CASO A CONDIÇÃO NÃO FOR ATENTIDA (FALSE)
}

9.4 ifelse

O raciocínio lógico utilizado na função ifelse é o mesmo que aprendemos com as funções if e else.

A função será utilizada da seguinte forma:

  • ifelse(Condição,Ação se for a condição for verdadeira, Ação se a condição for falsa)

Porém, a diferença é que a função ifelse é aplicada a um vetor. Isso a torna extremamente útil e facilitará a nossa vida em alguns casos.

Exemplo:

vetor<-c(2,10,5,50,9,15,3,0,25)

vetor2 <- ifelse(vetor<10,"menor","MAIOR")

vetor2
## [1] "menor" "MAIOR" "menor" "MAIOR" "menor" "MAIOR" "menor" "menor" "MAIOR"

A solução acima não pode ser aplicada ao método if-else ensinado no item anterior.

if(vetor<10){
  vetor2<-"menor"
}else{
  vetor2<-"MAIOR"
}
## Warning in if (vetor < 10) {: a condição tem comprimento > 1 e somente o
## primeiro elemento será usado
vetor2  
## [1] "menor"

Portanto, caso precise usar uma função condicional para vetores, a função ifelse é uma das opções que você deve considerar.

Lembre-se também que caso você esteja trabalhando com um data frame, cada coluna de seu data frame pode ser tratada como um vetor.

A seguir vamos criar uma nova coluna em um data frame baseada em uma condição lógica:

head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
# Suponha que o objetivo seja criar duas categorias de carros, os que gastam muito combustível e os que gastam pouco.
# para isso, vamos usar a variável mpg (milhas por galão).

mtcars$consumo_combustivel<-ifelse(mtcars$mpg<20,"Bebe muito","Bebe pouco")

head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
##                   consumo_combustivel
## Mazda RX4                  Bebe pouco
## Mazda RX4 Wag              Bebe pouco
## Datsun 710                 Bebe pouco
## Hornet 4 Drive             Bebe pouco
## Hornet Sportabout          Bebe muito
## Valiant                    Bebe muito

Então, colocamos as colunas (que são vetores) do data frame mtcars como argumentos da função ifelse.

www.luisotavio.pro