Introdução ao R | Aula 06

Funções

Filosofia de publicação (Selo DC)

Apoio CEAC e UFSJ

Livro de Apoio

Usaremos Batista e Oliveira (2022):

Introdução

Mais uma vez, nos reportamos aos princípios do R, definidos por Chambers (2016), mais especificamente ao segundo princípio,

Princípio da função: Tudo que acontece no R é uma chamada de função.

Introdução

  • Quando associamos um nome ao objeto, isto é, x <- 10; Na realizada, temos: `<-`(x, 10);
  • Quando digitamos no x no console e, posteriormente, apertando o botão ENTER do teclado, nos bastidores, estamos na realidade chamando a função print(x) para imprimir o valor que o nome se associa;

O que é uma função em R?

Uma função em R é um objeto como qualquer outro. Os tipos são: closure, special ou buitin.

O que é uma função em R?

Tabela: Tipo de funções.
Tipo de função typeof() mode()
Criada por usuário closure function
Função interna que não avalia seus argumentos special function
Função interna que avalia seus argumentos bultin function

O que é uma função em R?

  • Para identificar se um objeto é uma função, usamos: is.function();
  • As funções internas usam as chamadas .Internal() e .Primitive(), sendo funções que representam uma interface para as linguagens de baixo nível, do qual as funções foram implementadas;
  • As funções internas só o R Core Team podem criá-las;
  • A nível de usuário, criamos as funções do tipo: closure;

Funções do tipo closure

As funções do tipo closure são dividas em três componentes:

  • Argumentos, função formals()
  • Corpo, função body() e
  • Ambiente, função environment().

Primeiro exemplo

> # Vetor
> y <- c(5, 3, 4); y
[1] 5 3 4
> # Funcao
> sort(x = y)
[1] 3 4 5

Primeiro exemplo (continuação…)

> # Argumentos da funcao sort
> formals(sort)
$x


$decreasing
[1] FALSE

$...
> # Corpo da funcao
> body(sort)
{
    if (!is.logical(decreasing) || length(decreasing) != 1L) 
        stop("'decreasing' must be a length-1 logical vector.\nDid you intend to set 'partial'?")
    UseMethod("sort")
}

Primeiro exemplo (continuação…)

> # Ambiente
> environment(sort)
<environment: namespace:base>

Argumentos de entrada e padrão

A função sort() tem argumento padrão para decreascing = FALSE

> # Funcao
> sort(x = y, decreasing = TRUE)
[1] 5 4 3

Funções em pacotes

Pacotes: Entenda por pacote um diretório contendo subdiretórios e arquivos específicos. Em um dos subdiretórios, temos o local onde armazenamos as funções criadas. Ao instalar e anexar o pacote no R, todas as funções tornam-se disponíveis no ambiente global. Os pacotes nativos padrão sempre estão disponíveis para execução.

Funções em pacotes

  • Principal pacote nativo: base;
  • Sempre estará anexado ao caminho de busca;
  • Acessar funções sem anexar, Sintaxe: nome_pacote::nome_função

Ajuda sobre funções em pacotes

> ?sort()
> ??sort()
> help("sort")

Chamada de função

  • Aninhado:
> # Gerando 100 numeros aleatorios de uma distribuicao normal
> set.seed(10) # Semente
> x <- rnorm(100)
> 
> # Calculando o desvio padrao
> sqrt(var(x))
[1] 0.9412359

Chamada de função (continuação…)

  • intermediária:
> # Calculando o desvio padrao
> vari <- var(x)
> desvpad <- sqrt(vari); desvpad
[1] 0.9412359

Chamada de função (continuação…)

  • Pipe:
> # Calculando o desvio padrao
> x |>
+   var() |>
+   sqrt()
[1] 0.9412359

Como criar funções

  • Sintaxe:
# Forma usual
nome_funcao <- function(arg1, arg2, ...) {
   corpo: comandos..
}
# Forma simplificada
nome_funcao <- function(arg1, arg2, ...) corpo

Exemplo 1

> # Funcao
> fun1 <- function(x) {
+   res <- x + 1
+   return(res)
+ }
> # Chamada
> fun1(x = 5)
[1] 6

Componentes de fun1()

> # Argumentos
> formals(fun1)
$x
> # Corpo
> body(fun1)
{
    res <- x + 1
    return(res)
}
> # Ambiente
> environment(fun1)
<environment: R_GlobalEnv>

Não é obrigatório return()

> # Funcao
> fun2 <- function(x) x + 1
> # Executando
> fun2(5)
[1] 6
> estdesc <- function(x, opcao) {
+   res <- switch(opcao,
+            media = round(mean(x), 4),
+            mediana = round(mean(x), 4),
+            medapar = round(mean(x, trim = 0.1), 4))
+   return(res)
+ }
> 
> # Objeto
> set.seed(15)
> x <- rnorm(1000)

Ordenamento de argumentos (continuação…)

> # Argumentos nomeados na funcao
> estdesc(x = x, opcao = "media")
[1] 0.037
> estdesc(opcao = "media", x = x)
[1] 0.037

Ordenamento de argumentos (continuação…)

> # Argumentos não nomeados ordenados
> estdesc(x, "media")
[1] 0.037
> # Argumentos não ordenados (Gera erro)
> estdesc("media", x)
Error in switch(opcao, media = round(mean(x), 4), mediana = round(mean(x), : EXPR deve ser um vetor de comprimento 1

Objeto reticências

# Funcao que plota um grafico
grafico <- function(x, y, ...) {
  plot(x = x, y = y, ...)
}
# Vetores
x <- 1:10; y <- rnorm(10)
# Chamada 1, com os argumentos definidos
grafico(x = x, y = y, main = "Meu gráfico")

Escopo léxico

  • Ambiente envolvente
  • Ambiente de execuções

Exemplo 2

> x <- 10
> fun <- function() {
+   x <- 2
+   x
+ }
> # Chamando a funcao fun
> fun()
[1] 2

Exemplo 3

> x <- 10
> fun <- function() {
+   x
+ }
> # Chamando a funcao fun
> fun()
[1] 10

Ambiente de execução

> # Funcao
> fun <- function() x + 10
> # Objeto 1
> x <- 10
> # Chamada1
> fun()
[1] 20
> # Objeto 2
> x <- 20
> # Chamada 2
> fun()
[1] 30

Novo começo

> # Objeto
> n <- 1
> # Funcao
> fun <- function() {
+   n <- n + 1
+   n
+ }
> # Chamada 1
> fun()
[1] 2
> # Chamada 2
> fun()
[1] 2

Questões?

Dúvidas e Sugestões

Contato

Obrigado!

https://bendeivide.github.io/courses/estgeo/

Referências

BATISTA, B. D. O.; OLIVEIRA, D. A. B. J. R básico. Ouro Branco, MG, Brasil: [s.n.], 2022.
CHAMBERS, J. M. Extending R. Boca Raton, Florida: Chapman; Hall/CRC, 2016.