6  Estruturas

A seguir, apresentaremos algumas das estruturas fundamentais de programação no R, abordando conceitos de condicionais e loops.

6.1 Condicionamento

Em determinadas situações, é necessário executar uma parte do código apenas quando uma condição específica é atendida. O R oferece algumas estruturas básicas para organizar seu código nesse contexto: ifelse e if_else. A seguir, abordaremos detalhadamente cada uma dessas opções.

6.1.1 O if

A estrutura básica do if é a seguinte:

if(condicao){
  # conjunto de comandos que serão executados
  # caso a condição seja TRUE
}
  • Note que o código começa com o comando if, seguido por parênteses e chaves;

  • Dentro dos parênteses, deve-se inserir uma expressão lógica (ou um conjunto delas), cujo resultado será TRUE ou FALSE;

  • Dentro das chaves, especificamos o conjunto de instruções a serem executadas caso a condição dos parênteses seja avaliada como TRUE.

Veja o exemplo abaixo:

# Criando o objeto x
x = 10

# Bloco de condicionamento
if(x < 20){ #especificando a condição
  print("x é menor do que 20") #código a ser executado apenas se a condição for atendida
}
[1] "x é menor do que 20"

Observamos que a mensagem é exibida porque o valor do objeto x é inferior a 20, atendendo assim à condição estabelecida. Vejamos outro exemplo.

# Criando o objeto h
h = 8

# Bloco de condicionamento
if(x == h){ #especificando a condição
  x = x + h #código a ser executado apenas se a condição for atendida
}

# verificando o valor de x
x
[1] 10

Aqui percebemos que a condição lógica não foi satisfeita e o conjunto de códigos especificado dentro do if não foi executado.

Suponha que, caso a condição não seja atendida, você queira executar um conjunto específico de comandos alternativos.

6.1.2 O if em conjunto com o else

Vamos ver agora como acrescentar a estrutura de condicionamento if o opcional else.

A estrutura básica do ifcom o opcional else é a apresentada a seguir:

if(condicao){
  # conjunto de comandos que serão executados
  # caso a condição seja TRUE
} else{
  # conjunto de comandos que serão executados
  # caso a condição seja FALSE
}
  • Observem que o código começa da mesma forma que no exemplo anterior, com o comando if, seguido por parênteses e chaves;

  • Novamente, os parênteses devem conter uma expressão lógica (ou conjunto delas), cujo resultado será TRUE ou FALSE;

  • Dentro das chaves do if, especificamos o conjunto de instruções a serem executadas se a condição dos parênteses for avaliada como TRUE;

  • Logo após, temos a opção else, também seguida de chaves;

  • Dentro das chaves do else, definimos o conjunto de comandos a serem executados caso a condição dos parênteses do if seja avaliada como FALSE.

# Criando o objeto z
z = 2

# Bloco de condicionamento
if(z < 20){ #especificando a condição
  z = z^h
  cat("O valor de z foi alterado para", z) #código a ser executado apenas se a condição for atendida
} else{
  z = z * h
  cat("O valor de z foi alterado para", z) #código a ser executado se a condição não for atendida
}
O valor de z foi alterado para 256

Podemos encadear diversos if e elseem sequência como mostra o exemplo a seguir:

# Criando o objeto x
x = 10

# Bloco de condicionamento
if(x < 10){ #especificando a condição 1
  x = x + h #código a ser executado apenas se a condição 1 for atendida
  cat("O valor de x foi alterado para", x)
} else if(x >=10 & x<20){ #especificando a condição 2
  x = x/h #código a ser executado apenas se a condição 2 for atendida
  cat("O valor de x foi alterado para", x)
} else{
    x = x/2 #código a ser executado apenas se as condições 1 e 2 não forem atendidas
  cat("O valor de x não foi alterado:", x)
}
O valor de x foi alterado para 1.25

Se x for um vetor em vez de um único número, os comandos criados anteriormente serão executados para todos os elementos individuais de x?

6.1.3 A função if_else

Os comandos if, com ou sem o else, não são vetorizados. Se você tentar aplicar o código anterior a um vetor x em vez de um valor único, receberá uma mensagem de erro indicando que o tamanho de x é maior que 1. Para lidar com essas situações, uma alternativa é usar a função if_else.

A função if_else possui a seguinte estrutura básica:

if_else(condicao, valor_se_TRUE, valor_se_FALSE)
  • Observe que o primeiro argumento é uma expressão lógica (ou conjunto delas), que retornará TRUE ou FALSE para cada elemento do vetor;

  • O segundo argumento é o valor a ser retornado quando a condição for avaliada como TRUE;

  • E o terceiro argumento é o valor a ser retornado quando a condição for avaliada como FALSE.

#Ativando o pacote dplyr
library(dplyr)

# Criando o objeto x
x = c(310,20,230,40)

#Bloco de condicionamento
if_else(condition = x >130, #especificando a condição 
        true = 1, #valor a ser retornado caso a condição avaliada seja atendida
        false = x/10) #valor a ser retornado caso a condição avaliada não seja atendida
[1] 1 2 1 4

Ao observar o resultado da função if_else aplicada a cada elemento do vetor x, notamos que a operação correspondente é executada conforme a condição: se a condição é atendida, o valor retornado é 1; caso contrário, é retornado o valor de x dividido por 10.

6.2 Loopings

6.2.1 O for

Um looping que utiliza o for no R possui a seguinte estrututa básica:

for(j in conjunto_de_valores){
  # conjunto de comandos que 
  # serão repetidos
  # tantas vezes quanto for o tamanho do conjunto de valores
}
  • Observe que o início do loop é bastante semelhante ao if, começando com o comando for, seguido por parênteses e chaves;

  • Dentro dos parênteses, definimos um indicador que será utilizado durante o loop (neste caso, escolhemos j para representar esse indicador) e um conjunto de valores a serem iterados (denominado aqui como conjunto_de_valores);

  • Dentro das chaves, especificamos o conjunto de comandos a ser executado durante cada iteração do loop.

#Definindo x como um objeto nulo que será preenchido futuramente
x = NULL

#Definindo a igual a 2
a = 2

# Bloco de looping
for(j in 1:10){ #definindo o iterador j e o conjunto de valores
  x[j] = a^j #ação que será executada em cada iteração
}

#Visualizando x
x
 [1]    2    4    8   16   32   64  128  256  512 1024
#Apresentando uma mensagem com os 5 primiros valores de x
for(j in 1:5){
  cat("O valor do", j,"elemento de x é:", x[j], "\n")
}
O valor do 1 elemento de x é: 2 
O valor do 2 elemento de x é: 4 
O valor do 3 elemento de x é: 8 
O valor do 4 elemento de x é: 16 
O valor do 5 elemento de x é: 32 

O \n serve para forçar uma quebra de linha entre as mensagens apresentadas em cada interação.

6.2.2 O while

Um looping que utiliza o while no R tem a seguinte estrututa básica:

while(condicao_for_satisfeita){
  # conjunto de comandos que 
  # serão repetidos
  # enquanto a condicao continuar retornando TRUE
}
  • Observe que o loop começa com o comando while, seguido por parênteses e chaves;

  • Dentro dos parênteses, definimos uma condição que será verificada a cada iteração;

  • Dentro das chaves, listamos o conjunto de comandos a ser executado enquanto a condição permanecer TRUE.

#Definindo o objeto x
x = 1

#Somando a x o valor 1 enquanto sua soma não exceder 5
while( x < 5){
  x = x + 1
  print(x)
}
[1] 2
[1] 3
[1] 4
[1] 5

6.3 Desafio 1

  1. Crie um projeto chamado estrutura.
  2. Crie um objeto denominado “final” que agrupe todas as bases de vendas por ano em um único conjunto. Portanto, é crucial incluir uma variável que identifique o ano correspondente a cada linha. Realize essa tarefa utilizando necessariamente um loop for.
  3. Adicione uma variável à base final criada no item anterior que classifique as vendas como “acima da média” ou “abaixo/igual à média”. A média referida é o número médio de produtos vendidos no ano em questão.