Manipulação de dados e programação em R



NT265/NE441 - Análise de dados e apresentação de gráficos usando a linguagem R

24 de outubro de 2024

Maurício Vancine



  • Ecólogo e Doutor em Ecologia

  • Pós-Doc em Ecologia Espacial (Mathias)

  • Ecologia Espacial

  • Modelagem Ecológica

  • Análise de Dados Ecológicos e Geoespaciais

  • Ecologia e Conservação de Anfíbios

  • Open source [R, QGIS, GRASS GIS, GNU/Linux, …]

Análises Ecológicas no R (2022)


Conteúdo

  • Revisão dos 10 principais conceitos em R
  • Pseudocódigo
  • Dados brutos
  • Observações e variáveis
  • Tabelas de frequência
  • Frequência absoluta e relativa
  • Função: table
  • Medidas de posição e dispersão
  • Funções: apply, lapply, sapply, tapply
  • Controle de fluxo
  • Condicional: if, else e else if
  • Estruturas de repetição
  • Laços: for, while e repeat
  • Comandos: break e next
  • Funções
  • Funções externas: source

IMPORTANTE!!!

Estamos num espaço seguro e amigável

Sintam-se à vontade para me interromper e tirar dúvidas

Revisão

Revisão dos 10 principais conceitos em R



  1. Console
  2. Script
  3. Operadores
  4. Objetos
  5. Funções
  1. Pacotes (packages)
  2. Ajuda (help)
  3. Ambiente (environment)
  4. Diretório
  5. Citações

Pseudocódigo

  • Forma de representar algoritmos, funções ou outros processos de forma simplificada e intuitiva

  • Escrito em linguagem natural e com elementos que se assemelham a uma linguagem de programação, mas não é realmente executável

  • Ferramenta para a comunicação de ideias de programação, permitindo que programadores de diferentes níveis de habilidade compreendam e colaborem de maneira eficiente

Pseudocódigo

# pseudocodigo
0. pacotes
1. importar dados
2. limpar e ajustar dados
3. analises estatisticas
4. graficos
5. exportar resultados
# codigo

# 0. pacotes
library(tidyverse)
library(palmerpenguins)

# 1. importar dados
penguins <- penguins_raw
penguins

# 2. limpar e ajustar dados
penguins_clean <- na.omit(penguins)
penguins_clean

# 3. analises estatisticas
cor.test(penguins_clean$bill_length_mm, penguins_clean$bill_depth_mm)

# 4. graficos
plot(penguins_clean$bill_length_mm, penguins_clean$bill_depth_mm, pch = 20)

# 5. exportar resultados
png("grafico_penguins.png")
plot(penguins_clean$bill_length_mm, penguins_clean$bill_depth_mm, pch = 20)
dev.off()

Dúvidas?

Para apresentar os próximos conceitos e funções, vamos usar dados de pinguins

palmerpenguins

palmerpenguins

# instalar 
install.packages("palmerpenguins")

# carregar
library(palmerpenguins)

# ajuda dos dados
?penguins
?penguins_raw

# remover nas
penguins_sem_na <- na.omit(penguins)

Análise exploratória de dados (AED)

Dados brutos

  • palmerpenguins
head(penguins_sem_na, n = 10)
# A tibble: 10 × 8
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           36.7          19.3               193        3450
 5 Adelie  Torgersen           39.3          20.6               190        3650
 6 Adelie  Torgersen           38.9          17.8               181        3625
 7 Adelie  Torgersen           39.2          19.6               195        4675
 8 Adelie  Torgersen           41.1          17.6               182        3200
 9 Adelie  Torgersen           38.6          21.2               191        3800
10 Adelie  Torgersen           34.6          21.1               198        4400
# ℹ 2 more variables: sex <fct>, year <int>

Observações e variáveis

  • Cada linha dos dados é uma observação
  • Cada coluna dos dados é uma variável
head(penguins_sem_na, n = 10)
# A tibble: 10 × 8
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           36.7          19.3               193        3450
 5 Adelie  Torgersen           39.3          20.6               190        3650
 6 Adelie  Torgersen           38.9          17.8               181        3625
 7 Adelie  Torgersen           39.2          19.6               195        4675
 8 Adelie  Torgersen           41.1          17.6               182        3200
 9 Adelie  Torgersen           38.6          21.2               191        3800
10 Adelie  Torgersen           34.6          21.1               198        4400
# ℹ 2 more variables: sex <fct>, year <int>

Tabela de frequência


  • Dados brutos: conjunto dos valores numéricos coletados na pesquisa

  • Classes: intervalo de valores contínuos (0 |— 1)

  • Frequência absoluta (fi): número de vezes que uma observação aparece ou pertencente a um intervalo ou classe

  • Frequência total: soma de todas as frequências absolutas (fi)

  • Frequência relativa (fri): valor da razão de cada frequência absoluta (fi) com a frequência total (somatório de fi)

  • Frequência acumulada (Fi): obtida somando (acumulando) os valores da frequência absoluta (fi)

  • Frequência relativa acumulada (Fri): obtida somando (acumulando) os valores da frequência relativa (fri)

Tabela de frequência


Classes Freq. absoluta (fi) Freq. relativa (fri) Freq. acumulada (Fi) Freq. relativa acumulada (Fri)
0|—1 4 0.13 4 0.13
1|—2 8 0.26 12 0.39
2|—3 12 0.39 24 0.77
3|—4 7 0.23 31 1.00
Total 31 1.00

table

  • Cria uma tabela de frequências para variáveis categóricas ou para a combinação de variáveis
  • Sintaxe:
table(..., exclude = NULL, useNA = "no")
  • ...: Vetores ou variáveis categóricas a serem tabuladas

  • exclude: Valores a serem excluídos (como NA)

  • useNA: Se e como contar valores faltantes (“no”, “ifany”, “always”)

  • Exemplo

# vetor categorico
cores <- c("vermelho", "azul", "verde", "vermelho", "azul", "vermelho")

# tabela de frequências
table(cores)
cores
    azul    verde vermelho 
       2        1        3 

Tabela de frequência


Frequência absoluta (fi)

table(penguins_sem_na$species)

   Adelie Chinstrap    Gentoo 
      146        68       119 

Tabela de frequência


Frequência absoluta (fi)

table(penguins_sem_na$species)

   Adelie Chinstrap    Gentoo 
      146        68       119 


Frequência relativa (fri)

prop.table(table(penguins_sem_na$species))

   Adelie Chinstrap    Gentoo 
0.4384384 0.2042042 0.3573574 

Função composta

prop.table(table(penguins_sem_na$species))

# funcao composta
1:3
sum(1:3)
log(sum(1:3))

Tabela de frequência


Frequência absoluta (fi)

table(penguins_sem_na$species)

   Adelie Chinstrap    Gentoo 
      146        68       119 


Frequência relativa (fri)

prop.table(table(penguins_sem_na$species)) * 100

   Adelie Chinstrap    Gentoo 
 43.84384  20.42042  35.73574 

Tabela de frequência


Frequência absoluta (fi)

table(penguins_sem_na$species)

   Adelie Chinstrap    Gentoo 
      146        68       119 


Frequência relativa (fri)

round(prop.table(table(penguins_sem_na$species)), 4) * 100

   Adelie Chinstrap    Gentoo 
    43.84     20.42     35.74 

Tabela de frequência


Frequência absoluta de duas colunas (fi)

table(penguins_sem_na$species, penguins_sem_na$island)
           
            Biscoe Dream Torgersen
  Adelie        44    55        47
  Chinstrap      0    68         0
  Gentoo       119     0         0

Frequência relativa de duas colunas (fri)

round(prop.table(table(penguins_sem_na$species, penguins_sem_na$island)), 4) * 100
           
            Biscoe Dream Torgersen
  Adelie     13.21 16.52     14.11
  Chinstrap   0.00 20.42      0.00
  Gentoo     35.74  0.00      0.00

Para se aprofundar


  • cumsum: função para soma cumulativa
  • cut: função para dividir uma sequencia de valores em intervalos
  • janitor: pacote com funções para limpar bases de dados e fazer tabelas de frequência

Dúvidas?

Medidas-resumo

Medidas de posição


  • Moda: valor mais frequente das observações

  • Mediana: valor que divide as observações ordenadas em duas partes iguais

  • Média aritmética: soma das observações dividida pelo número de observações

  • Outras médias: ponderada, geométrica e harmônica

Medidas-resumo

Medidas de dispersão


  • Variância: medida de quantas observações diferem do valor central (média)

  • Desvio padrão: raiz quadrada da variância (mantêm a mesma unidade de medida)

  • Erro padrão: variação da média amostral em relação à média populacional (confiabilidade da média amostral)

apply

  • Função nativa no R que aplica uma função sobre as margens de um array ou matriz
  • Sintaxe:
apply(X, MARGIN, FUN, ...)
  • X: matriz, data frame ou array em que será aplicada a função

  • MARGIN: valor indica a margem onde a função será aplicada (1 = linhas ou 2 = colunas)

  • FUN: função que será aplicada

  • Exemplo:

# matriz
m <- matrix(1:9, nrow = 3, byrow = TRUE)
m 
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
# funcao mean nas linhas (MARGIN = 1)
m_mean_row <- apply(m, 1, mean)
m_mean_row
[1] 2 5 8

apply

m <- matrix(c(1, 3, 5, 2, 4, 6), ncol = 3, byrow = TRUE)
m
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
apply(m, 1, sum)
[1]  9 12

Família apply

  • Aplicam uma função a elementos de estruturas de dados como vetores, listas, matrizes ou data frames de forma eficiente, evitando laços
# familia apply
apply(X, MARGIN, FUN, ...)
lapply(X, FUN, ...)
sapply(X, FUN, ...)
vapply(X, FUN, FUN.VALUE, ...)
tapply(X, INDEX, FUN, ...)
mapply(FUN, ..., MoreArgs = NULL)
rapply(object, f, classes = "ANY", how = "replace")

lapply

  • Aplica uma função a cada elemento de uma lista ou vetor, retornando sempre uma lista

  • Exemplos

# lista
x <- list(a = 1:5, b = 6:10)
x
$a
[1] 1 2 3 4 5

$b
[1]  6  7  8  9 10
lapply(x, mean)  # media de cada lista - retorna lista
$a
[1] 3

$b
[1] 8

sapply

  • Similar a lapply, retornando matriz, vetor ou lista (ele escolhe…)
  • Exemplos
# lista
x <- list(a = 1:5, b = 6:10)
x
$a
[1] 1 2 3 4 5

$b
[1]  6  7  8  9 10
sapply(x, mean)  # media de cada lista - retorna o que quiser...
a b 
3 8 

vapply

  • Similar a sapply, mas permite definir o tipo de retorno
  • Exemplos
# lista
x <- list(a = 1:5, b = 6:10)
x
$a
[1] 1 2 3 4 5

$b
[1]  6  7  8  9 10
vapply(x, mean, numeric(1))  # media de cada lista - retorna escolha
a b 
3 8 

tapply

  • Aplica função sobre subconjuntos definido por fatores
  • Exemplos
# data frame
df <- data.frame(x = c(rep(1, 3), rep(2, 3)), 
                 f = factor(rep(1:2, each = 3)))
df
  x f
1 1 1
2 1 1
3 1 1
4 2 2
5 2 2
6 2 2
tapply(df$x, df$f, sum)  # soma por grupo
1 2 
3 6 

mapply

  • Aplica função a múltiplos vetores ou listas de forma paralela
  • Exemplos
# dois vetores
x <- c(1, 2, 3)
y <- c(4, 5, 6)

mapply(sum, x, y) # soma de cada elemento
[1] 5 7 9


# dois vetores
x <- c(1, 2, 3)
y <- c(4, 5, 6)

mapply(paste0, x, y) # combinacao de cada elemento
[1] "14" "25" "36"

rapply

  • Função recursiva usada para aplicar uma função a todos os elementos de uma lista (ou estrutura aninhada de listas)
  • Exemplos
# lista
l <- list(a = 4, b = "texto", c = list(d = 25, e = 36))
l
$a
[1] 4

$b
[1] "texto"

$c
$c$d
[1] 25

$c$e
[1] 36

rapply

  • Função recursiva usada para aplicar uma função a todos os elementos de uma lista (ou estrutura aninhada de listas)
  • Exemplos
# aplica sqrt() apenas aos elementos numericos
rapply(l, sqrt, classes = "numeric", how = "replace")
$a
[1] 2

$b
[1] "texto"

$c
$c$d
[1] 5

$c$e
[1] 6

rapply

  • Função recursiva usada para aplicar uma função a todos os elementos de uma lista (ou estrutura aninhada de listas)
  • Exemplos
# aplica sqrt() e retornando um vetor achatado
rapply(l, sqrt, classes = "numeric", how = "unlist")
  a c.d c.e 
  2   5   6 


# usando deflt para retornar NA para elementos nao numericos
rapply(l, sqrt, classes = "numeric", deflt = NA)
  a   b c.d c.e 
  2  NA   5   6 

Medidas-resumo


Média

# media por linhas
apply(penguins_sem_na[1:20, 3:6], 1, mean)
 [1]  997.200 1010.725  875.825  924.750  974.975  965.675 1232.200  860.175
 [9] 1012.700 1163.425  984.850  925.675 1190.050  890.450 1115.375  907.525
[17]  959.100 1011.025 1047.825 1009.000


# media por colunas
apply(penguins_sem_na[1:20, 3:6], 2, mean)
   bill_length_mm     bill_depth_mm flipper_length_mm       body_mass_g 
           38.695            19.010           187.750          3766.250 

Medidas-resumo


Desvio padrão

# desvio padrao por linhas
apply(penguins_sem_na[1:20, 3:6], 1, sd)
 [1] 1836.619 1861.021 1584.739 1685.311 1784.962 1774.364 2296.541 1561.572
 [9] 1859.765 2159.214 1811.644 1684.724 2208.028 1624.746 2057.828 1663.093
[17] 1762.071 1860.886 1936.213 1862.067


# desvio padrao por colunas
apply(penguins_sem_na[1:20, 3:6], 2, sd)
   bill_length_mm     bill_depth_mm flipper_length_mm       body_mass_g 
         2.627081          1.355651          6.873864        408.726762 

Medidas-resumo


Média

# media por especie
tapply(penguins_sem_na$bill_length_mm, penguins_sem_na$species, mean)
   Adelie Chinstrap    Gentoo 
 38.82397  48.83382  47.56807 


# media por ilha
tapply(penguins_sem_na$bill_length_mm, penguins_sem_na$island, mean)
   Biscoe     Dream Torgersen 
 45.24847  44.22195  39.03830 

Medidas-resumo


Desvio padrão

# desvio padrao por especie
tapply(penguins_sem_na$bill_length_mm, penguins_sem_na$species, sd)
   Adelie Chinstrap    Gentoo 
 2.662597  3.339256  3.106116 


# desvio padrao por ilha
tapply(penguins_sem_na$bill_length_mm, penguins_sem_na$island, sd)
   Biscoe     Dream Torgersen 
 4.827319  5.947069  3.028097 

Para se aprofundar


  • rowSums e colSums: soma de linhas e colunas
  • rowMeans e colMeans: média de linhas e colunas
  • rowMedians e colMedians: mediana de linhas e colunas
  • rowVars e colVars: variância de linhas e colunas
  • rowMins e colMins: mínimo de linhas e colunas
  • rowMaxs e colMaxs: máximo de linhas e colunas
  • rowProds e colProds: produto de linhas e colunas
  • rowCumsums e colCumsums: soma cumulativa de linhas e colunas
  • sweep(): função para subtrair, adicionar, multiplicar ou dividir cada linha ou coluna

Dúvidas?

Programação no R


  • Automatizar tarefas maçantes…
  • Direcionar o comportamento dos códigos com base em condições ou repetições
  • Criar funções para reutilizar códigos, melhorar organização, reduzir erros e maior generalização

IMPORTANTE!

Controle de fluxo

  • Muda o comportamento do código com base em condições
  • Condicionais: if, else e else if

Operadores

Operadores relacionais (TRUE|FALSE)


Operador Descrição Uso
< Menor a < b
> Maior a > b
== Igual a == b
<= Menor ou igual a <= b
>= Maior ou igual a > = b
!= Não igual (diferente) a!=b

Operadores

Operadores lógicos (TRUE|FALSE)


Operador Descrição Uso
! Lógico NÃO !a
& Lógico E (elementar) a & b
| Lógico OU (elementar a | b
&& Lógico E (primeiro) a && b
|| Lógico OU (primeiro) a || b

if

  • Se uma condição for verdadeira, faça …
# valor
x <- 10

# condicao
x > 5
[1] TRUE
# teste
if(x > 5){
    
    print("x é maior que 5")
    
}
[1] "x é maior que 5"

if

  • Se duas condições forem verdadeiras, faça …
# valores
x <- 10
y <- 10

# condicao
x > 5 & y > 8
[1] TRUE
# teste
if(x > 5 & y > 8){
    
    print("x e y são maiores que 5")
    
}
[1] "x e y são maiores que 5"

if

  • Se algo menos uma condição for verdadeira, faça …
# valores
x <- 10
y <- 2

# condicao
x > 5 | y > 8
[1] TRUE
# teste
if(x > 5 | y > 8){
    
    print("x ou y é maior que 5")
    
}
[1] "x ou y é maior que 5"

if e else

  • Se uma condição for verdadeira, faça …
  • Se não (falso), faça …
# valor
x <- 3

# condicao
x > 5
[1] FALSE
# teste
if(x > 5){
    print("x é maior que 5")
    } else{
        print("x é menor ou igual a 5")
}
[1] "x é menor ou igual a 5"

else if

  • Se uma condição for verdadeira, faça …
  • Se não (falso) se for verdadeiro, faça …
  • Se não (falso), faça …
x <- 7
if(x > 10){
    print("x é maior que 10")
    } else if(x > 5){
        print("x está entre 6 e 10")
        } else{
            print("x é 5 ou menor")
}
[1] "x está entre 6 e 10"

Dúvidas?

Estruturas de repetição

  • Executa um bloco de código com base em repetições
  • Laços: for, while e repeat
  • Controles: break e next

for

  • Executa um bloco de código para uma sequência de valores (vetores ou listas) [iteração]


# for
for(i in 1:10){
    print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

for

  • Executa um bloco de código para uma sequência de valores (vetores ou listas) [iteração]


# for
prog <- c("R", "python", "julia", "Fortran")
for(i in prog){
    print(i)
}
[1] "R"
[1] "python"
[1] "julia"
[1] "Fortran"

while

  • Executa um bloco de código enquanto uma condição é verdadeira
# while
x <- 1
while(x <= 5){
    print(x)
    x <- x + 1  # atualiza o x
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

repeat

  • Executa um bloco de código repetidamente até que uma condição de parada (break) seja atendida
# repeat
x <- 1
repeat{
    print(x)
    x <- x + 1
    if(x > 5){
        break  # para o loop para x > 5
    }
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

break

  • Usado para sair de um laço antes que ele complete todas as iterações
# break
for(i in 1:10){
    if(i == 6){
        break  # sai do laco quando i for igual a 6
    }
    print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

next

  • Usado para fazer o laço pular a próxima iteração sem executar o código que vem após ele
# next
for(i in 1:5){
    if(i == 3){
        next  # pula o numero 3
    }
    print(i)
}
[1] 1
[1] 2
[1] 4
[1] 5

Controle de fluxo e repetição

for

# for e if/else
for(i in 1:10){
    
    if(i %% 2 == 0){
        print(paste(i, "é par"))
    } else{
        print(paste(i, "é ímpar"))
    }
}
[1] "1 é ímpar"
[1] "2 é par"
[1] "3 é ímpar"
[1] "4 é par"
[1] "5 é ímpar"
[1] "6 é par"
[1] "7 é ímpar"
[1] "8 é par"
[1] "9 é ímpar"
[1] "10 é par"

Controle de fluxo e repetição

while

# while e if/else
x <- 1
while(x <= 10){
    
    if(x %% 2 == 0){
        print(paste(x, "é par"))
    } else{
        print(paste(x, "é ímpar"))
    }
    x <- x + 1
}
[1] "1 é ímpar"
[1] "2 é par"
[1] "3 é ímpar"
[1] "4 é par"
[1] "5 é ímpar"
[1] "6 é par"
[1] "7 é ímpar"
[1] "8 é par"
[1] "9 é ímpar"
[1] "10 é par"

Usos avançados do for

  • Iterando sobre elementos de uma lista
  • i assume o valor dos elementos
prog <- c("R", "python", "julia", "Fortran")

for(i in prog){
    print(i)

    }
[1] "R"
[1] "python"
[1] "julia"
[1] "Fortran"

Usos avançados do for

  • Iterando sobre posição dos elementos de uma lista
  • i assume a posição dos elementos
prog <- c("R", "python", "julia", "Fortran")

for(i in 1:length(prog)){
    
    print(i)
    print(prog[i])
    
}
[1] 1
[1] "R"
[1] 2
[1] "python"
[1] 3
[1] "julia"
[1] 4
[1] "Fortran"

Usos avançados do for

  • Combinando resultados em um objeto vazio
x <- c(1, 4, 9, 16)

obj <- NULL

for(i in x){
    
    raiz <- sqrt(i)
    obj <- c(obj, raiz)
}
obj
[1] 1 2 3 4

Usos avançados do for

  • Combinando resultados em um objeto vazio pela posição
x <- c(1, 10, 100, 1000)

obj <- NULL

for(i in 1:length(x)){
    
    obj[i] <- log10(x[i])
}
obj
[1] 0 1 2 3

Usos avançados do for

  • Combinando resultados em um objeto vazio por linhas
df <- data.frame()

for(i in 1:5){

  q <- i^2
  c <- i^3
  res <- data.frame(numero = i, quadrado = q, cubo = c)
  df <- rbind(df, res)
}
df
  numero quadrado cubo
1      1        1    1
2      2        4    8
3      3        9   27
4      4       16   64
5      5       25  125

Usos avançados do for

  • Combinando resultados em um objeto vazio por colunas
df <- data.frame(numero = 1:5)

for(i in 1:5){
    
    res <- i * 1:5
    df_res <- data.frame(res)
    colnames(df_res) <- paste0("mult", i)
    df <- cbind(df, df_res)
}
df
  numero mult1 mult2 mult3 mult4 mult5
1      1     1     2     3     4     5
2      2     2     4     6     8    10
3      3     3     6     9    12    15
4      4     4     8    12    16    20
5      5     5    10    15    20    25

Funções

  • Uma função é um bloco de código que realiza uma tarefa específica

  • Possui entradas (argumentos) e retorna saídas (resultados)

  • Utilizada para evitar repetição de código, tornando-o mais organizado e reutilizável

Estrutura de uma função

  • nome_da_funcao: nome de escolha da função
  • argumentos: valores de entrada que a função recebe
  • retorno: especifica o que a função devolve (return())
# estrutura
nome_da_funcao <- function(argumentos){
  # corpo da funcao
  # calculos, operacoes ou processos
  return(resultado)
}

Exemplo de funções

  • Funções com um argumento
  • Elevar um número ao quadrado
# definicao
quadrado <- function(x){
  return(x^2)
}

# uso
quadrado(2)
[1] 4

Exemplo de funções

  • Funções com um argumento
  • Raiz quadrada de um número
# definicao
raiz <- function(x){
  return(x^(1/2))
}

# uso
raiz(4)
[1] 2

Exemplo de funções

  • Funções com múltiplos argumentos
  • Soma dois números
# definicao
soma <- function(a, b){
  return(a + b)
}

# uso
soma(40, 2)
[1] 42

Exemplo de funções

  • Argumentos com valores padrão
# definicao
saudacao <- function(nome = "Amigo"){
  return(paste("Olá,", nome))
}

# uso
saudacao()
[1] "Olá, Amigo"
saudacao("Maurício")
[1] "Olá, Maurício"

Exemplo de funções

  • Função com controle de fluxo
  • Verificar se um número é par ou ímpar
# definicao
par_ou_impar <- function(num){
  if(num %% 2 == 0){
    return("Par")
  } else{
    return("Ímpar")
  }
}

# uso
par_ou_impar(42)
[1] "Par"
par_ou_impar(23)
[1] "Ímpar"

Exemplo de funções

  • Função com repetições
  • Soma sequência de valores
# definicao
soma_sequencia <- function(n){
  total <- 0
  for(i in 1:n){
    total <- total + i
  }
  return(total)
}

# uso
soma_sequencia(3)
[1] 6

Exemplo de funções

  • O ... permite passar um número indefinido de argumentos para a função
# definicao
soma_variavel <- function(...){
  return(sum(...))
}

# uso
soma_variavel(1, 2, 3, 4)
[1] 10
# uso
soma_variavel(1:100)
[1] 5050

Funções externas

  • Permite usar uma função em um script separado do script principal
  • Carrega e executa código salvo em um arquivo de script externo
# arquivo: funcoes_util.R
soma <- function(a, b) {
  return(a + b)
}

multiplicacao <- function(a, b) {
  return(a * b)
}

Funções externas

  • Permite usar uma função em um script separado do script principal
  • Carrega e executa código salvo em um arquivo de script externo
# carrega as funcoes
source("funcoes_util.R")

# uso
res_soma <- soma(3, 5)
res_soma
[1] 8
res_multi <- multiplicacao(3, 5)
res_multi
[1] 15

Dúvidas?

Muito obrigado!