Introdução à Lógica de Programação

Estruturas de Repetição


data(mtcars)
df <- mtcars


Instrução for:


for(i in 1:5) {
  mensagem <- paste("Esta é a iteração número", i)
  print(mensagem)
}
## [1] "Esta é a iteração número 1"
## [1] "Esta é a iteração número 2"
## [1] "Esta é a iteração número 3"
## [1] "Esta é a iteração número 4"
## [1] "Esta é a iteração número 5"


for(i in 1:nrow(df)) {
  veiculo <- rownames(df)[i]
  n_cilindros <- df$cyl[i]
  mensagem <- paste("O veículo", veiculo, "possui", n_cilindros, "cilindros")
  print(mensagem)
}
## [1] "O veículo Mazda RX4 possui 6 cilindros"
## [1] "O veículo Mazda RX4 Wag possui 6 cilindros"
## [1] "O veículo Datsun 710 possui 4 cilindros"
## [1] "O veículo Hornet 4 Drive possui 6 cilindros"
## [1] "O veículo Hornet Sportabout possui 8 cilindros"
## [1] "O veículo Valiant possui 6 cilindros"
## [1] "O veículo Duster 360 possui 8 cilindros"
## [1] "O veículo Merc 240D possui 4 cilindros"
## [1] "O veículo Merc 230 possui 4 cilindros"
## [1] "O veículo Merc 280 possui 6 cilindros"
## [1] "O veículo Merc 280C possui 6 cilindros"
## [1] "O veículo Merc 450SE possui 8 cilindros"
## [1] "O veículo Merc 450SL possui 8 cilindros"
## [1] "O veículo Merc 450SLC possui 8 cilindros"
## [1] "O veículo Cadillac Fleetwood possui 8 cilindros"
## [1] "O veículo Lincoln Continental possui 8 cilindros"
## [1] "O veículo Chrysler Imperial possui 8 cilindros"
## [1] "O veículo Fiat 128 possui 4 cilindros"
## [1] "O veículo Honda Civic possui 4 cilindros"
## [1] "O veículo Toyota Corolla possui 4 cilindros"
## [1] "O veículo Toyota Corona possui 4 cilindros"
## [1] "O veículo Dodge Challenger possui 8 cilindros"
## [1] "O veículo AMC Javelin possui 8 cilindros"
## [1] "O veículo Camaro Z28 possui 8 cilindros"
## [1] "O veículo Pontiac Firebird possui 8 cilindros"
## [1] "O veículo Fiat X1-9 possui 4 cilindros"
## [1] "O veículo Porsche 914-2 possui 4 cilindros"
## [1] "O veículo Lotus Europa possui 4 cilindros"
## [1] "O veículo Ford Pantera L possui 8 cilindros"
## [1] "O veículo Ferrari Dino possui 6 cilindros"
## [1] "O veículo Maserati Bora possui 8 cilindros"
## [1] "O veículo Volvo 142E possui 4 cilindros"


Instrução while:


i <- 1
while(i <= 5) {
  mensagem <- paste("Esta é a iteração número", i)
  print(mensagem)
  i <- i + 1
}
## [1] "Esta é a iteração número 1"
## [1] "Esta é a iteração número 2"
## [1] "Esta é a iteração número 3"
## [1] "Esta é a iteração número 4"
## [1] "Esta é a iteração número 5"


i <- 1
while(i <= nrow(df)) {
  veiculo <- rownames(df)[i]
  n_cilindros <- df$cyl[i]
  mensagem <- paste("O veículo", veiculo, "possui", n_cilindros, "cilindros")
  print(mensagem)
  i <- i + 1
}
## [1] "O veículo Mazda RX4 possui 6 cilindros"
## [1] "O veículo Mazda RX4 Wag possui 6 cilindros"
## [1] "O veículo Datsun 710 possui 4 cilindros"
## [1] "O veículo Hornet 4 Drive possui 6 cilindros"
## [1] "O veículo Hornet Sportabout possui 8 cilindros"
## [1] "O veículo Valiant possui 6 cilindros"
## [1] "O veículo Duster 360 possui 8 cilindros"
## [1] "O veículo Merc 240D possui 4 cilindros"
## [1] "O veículo Merc 230 possui 4 cilindros"
## [1] "O veículo Merc 280 possui 6 cilindros"
## [1] "O veículo Merc 280C possui 6 cilindros"
## [1] "O veículo Merc 450SE possui 8 cilindros"
## [1] "O veículo Merc 450SL possui 8 cilindros"
## [1] "O veículo Merc 450SLC possui 8 cilindros"
## [1] "O veículo Cadillac Fleetwood possui 8 cilindros"
## [1] "O veículo Lincoln Continental possui 8 cilindros"
## [1] "O veículo Chrysler Imperial possui 8 cilindros"
## [1] "O veículo Fiat 128 possui 4 cilindros"
## [1] "O veículo Honda Civic possui 4 cilindros"
## [1] "O veículo Toyota Corolla possui 4 cilindros"
## [1] "O veículo Toyota Corona possui 4 cilindros"
## [1] "O veículo Dodge Challenger possui 8 cilindros"
## [1] "O veículo AMC Javelin possui 8 cilindros"
## [1] "O veículo Camaro Z28 possui 8 cilindros"
## [1] "O veículo Pontiac Firebird possui 8 cilindros"
## [1] "O veículo Fiat X1-9 possui 4 cilindros"
## [1] "O veículo Porsche 914-2 possui 4 cilindros"
## [1] "O veículo Lotus Europa possui 4 cilindros"
## [1] "O veículo Ford Pantera L possui 8 cilindros"
## [1] "O veículo Ferrari Dino possui 6 cilindros"
## [1] "O veículo Maserati Bora possui 8 cilindros"
## [1] "O veículo Volvo 142E possui 4 cilindros"


Estruturas Condicionais


data(mtcars)
df <- mtcars


Instrução if:


cilindros <- 4

if(cilindros > 4) {
  mensagem <- "Mais de 4 cilindros"
} else {
  mensagem <- "Até 4 cilindros"
}

print(mensagem)
## [1] "Até 4 cilindros"


classificador_veiculo <- function(cilindros) {
  if(cilindros > 4) {
    mensagem <- "Mais de 4 cilindros"
  } else {
    mensagem <- "Até 4 cilindros"
  }
  
  return(mensagem)
}


classificador_veiculo(2)
## [1] "Até 4 cilindros"
classificador_veiculo(6)
## [1] "Mais de 4 cilindros"


cilindros <- 4
carburadores <- 2

if(cilindros <= 4 & carburadores <= 2) {
  mensagem <- "Até 4 cilindros e até 2 carburadores"
} else if(cilindros > 4 & carburadores <= 2) {
  mensagem <- "Acima de 4 cilindros e até 2 carburadores"
} else if(cilindros <= 4 & carburadores > 2) {
  mensagem <- "Até 4 cilindros e acima de 2 carburadores"
} else {
  mensagem <- "Acima de 4 cilindros e acima de 2 carburadores"
}

print(mensagem)
## [1] "Até 4 cilindros e até 2 carburadores"


classificador_veiculo_2 <- function(cilindros, carburadores) {
  if(cilindros <= 4 & carburadores <= 2) {
    mensagem <- "Até 4 cilindros e até 2 carburadores"
  } else if(cilindros > 4 & carburadores <= 2) {
    mensagem <- "Acima de 4 cilindros e até 2 carburadores"
  } else if(cilindros <= 4 & carburadores > 2) {
    mensagem <- "Até 4 cilindros e acima de 2 carburadores"
  } else {
    mensagem <- "Acima de 4 cilindros e acima de 2 carburadores"
  }
  
  return(mensagem)
}


classificador_veiculo_2(2,2)
## [1] "Até 4 cilindros e até 2 carburadores"
classificador_veiculo_2(6,2)
## [1] "Acima de 4 cilindros e até 2 carburadores"
classificador_veiculo_2(2,6)
## [1] "Até 4 cilindros e acima de 2 carburadores"
classificador_veiculo_2(6,6)
## [1] "Acima de 4 cilindros e acima de 2 carburadores"


Combinando estruturas de repetição e condicionais


df$classificacao_veiculo <- NA

for(i in 1:nrow(df)) {
  if(df$cyl[i] <= 4 & df$carb[i] <= 2) {
    classificacao <- "Até 4 cilindros e até 2 carburadores"
  } else if(df$cyl[i] > 4 & df$carb[i] <= 2) {
    classificacao <- "Acima de 4 cilindros e até 2 carburadores"
  } else if(df$cyl[i] <= 4 & df$carb[i] > 2) {
    classificacao <- "Até 4 cilindros e acima de 2 carburadores"
  } else {
    classificacao <- "Acima de 4 cilindros e acima de 2 carburadores"
  }
  df$classificacao_veiculo[i] <- classificacao
}

table(df$classificacao_veiculo)
## 
## Acima de 4 cilindros e acima de 2 carburadores 
##                                             15 
##      Acima de 4 cilindros e até 2 carburadores 
##                                              6 
##           Até 4 cilindros e até 2 carburadores 
##                                             11


df$score <- NA

for(i in 1:nrow(df)) {
  if(df$hp[i] > 150) {
    coeficiente <- 1
  } else {
    coeficiente <- 2
  }
  score <- df$mpg[i] * coeficiente
  df$score[i] <- score
}

head(df)
##                    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
##                                            classificacao_veiculo score
## Mazda RX4         Acima de 4 cilindros e acima de 2 carburadores  42.0
## Mazda RX4 Wag     Acima de 4 cilindros e acima de 2 carburadores  42.0
## Datsun 710                  Até 4 cilindros e até 2 carburadores  45.6
## Hornet 4 Drive         Acima de 4 cilindros e até 2 carburadores  42.8
## Hornet Sportabout      Acima de 4 cilindros e até 2 carburadores  18.7
## Valiant                Acima de 4 cilindros e até 2 carburadores  36.2


calcula_score <- function(dataframe, col_score, var_referencia, valor_referencia, coef_1, coef_2, var_calculo) {
  
  dataframe[col_score] <- NA
  
  for(i in 1:nrow(dataframe)) {
    if(dataframe[i, var_referencia] > valor_referencia) {
      coeficiente <- coef_1
    } else {
      coeficiente <- coef_2
    }
    score <- dataframe[i, var_calculo] * coeficiente
    dataframe[i, col_score] <- score
  }
  
  return(dataframe)
}


df_2 <- calcula_score(dataframe = df, 
                      col_score = "score2", 
                      var_referencia = "hp",
                      valor_referencia = 150,
                      coef_1 = 1, 
                      coef_2 = 2, 
                      var_calculo = "mpg")

head(df_2)
##                    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
##                                            classificacao_veiculo score score2
## Mazda RX4         Acima de 4 cilindros e acima de 2 carburadores  42.0   42.0
## Mazda RX4 Wag     Acima de 4 cilindros e acima de 2 carburadores  42.0   42.0
## Datsun 710                  Até 4 cilindros e até 2 carburadores  45.6   45.6
## Hornet 4 Drive         Acima de 4 cilindros e até 2 carburadores  42.8   42.8
## Hornet Sportabout      Acima de 4 cilindros e até 2 carburadores  18.7   18.7
## Valiant                Acima de 4 cilindros e até 2 carburadores  36.2   36.2


Outras funções


Função ifelse()

df$class_cyl <- ifelse(df$cyl > 4, 
                       "acima de 4", 
                       "4 ou menos")
table(df$class_cyl)
## 
## 4 ou menos acima de 4 
##         11         21


df$class_hp <- ifelse(df$hp <= 150, 
                      "até 150",
                      ifelse(df$hp < 250, "entre 151 e 250", "acima de 250"))
table(df$class_hp)
## 
##    acima de 250         até 150 entre 151 e 250 
##               2              19              11



Função switch()

Anterior