Skip to content

Latest commit

 

History

History
174 lines (135 loc) · 3.57 KB

funcionais.org

File metadata and controls

174 lines (135 loc) · 3.57 KB

Funcionais em R

1 Recursividade

Base da programação funcional

  • Como é implementado?

2 O que são funcionais?

Todos as funções construídas na aula anterior

Definição

Uma função que recebe outra função

3 O funcional sapply (Vetores)

Permite aplicar uma função aos elementos de um vetor

  • Retorna um vetor
sapply(1:3, function(x) x^2)
[1] 1 4 9

4 O funcional lapply (Listas)

Permite aplicar uma função para todos os elementos de uma lista

  • Retorna uma lista com os retornos (na ordem)
lapply(1:3, function(x) x^2)
[[1]]
[1] 1

[[2]]
[1] 4

[[3]]
[1] 9

5 O operador ... (ellipsis)

Utilizado quando não se sabe a aridade de uma função

f <- function(x, ...)
{
  dots <- list(...)
  if(length(dots) == 0) return(NULL) 
  cat("The arguments in ... are\n")
  print(unlist(dots))
  f(...)
}
f(1,2,3,"a", list("monkey"))
The arguments in ... are
[1] "2"      "3"      "a"      "monkey"
The arguments in ... are
[1] "3"      "a"      "monkey"
The arguments in ... are
[1] "a"      "monkey"
The arguments in ... are
[1] "monkey"
NULL

6 … (ellipsis) versus lista: são diferentes.

soma <- function(l) {
    if (length(l) == 0) return(0);
    h <- head(l, n = 1)[[1]];
    t <- tail(l, n = length(l)-1);
    return(h+soma(t));
}
soma(c(1, 2, 3, 4, 5));

O código abaixo, similar a estrutura do de cima, não funciona. Por quê?

soma <- function(...) {
    l <- list(...)
    if(length(l) == 0) return(0)
    h <- head(l, n = 1)[[1]];
    t <- tail(l, n = length(l)-1);
    return(h+soma(t));
}
soma(1, 2, 3, 4, 5);

7 Compose (com o pacote functional)

Permite compor funções.

library(functional);
cabeca <- function(lista) lista[[1]];
resto <- function(lista) lista[2:length(lista)];
l <- c(1,2,3,4);
cabeca_do_resto <- Compose(resto, cabeca)
cabeca_do_resto(l);

8 Currying

Moses Schönfinkel (matemático russo)

  • Também inventor da notação de lógica combinatória
  • Propôs um método de transformação de funções

Currying

Transforma uma função com múltiplos argumentos em uma cadeia de funções, cada uma com um único argumento

Normak, 2007, escreve:

"... ela nos permite visualizar a função como se ela
  pegasse no máximo um único parâmetro. Currying pode
  ser visto como uma maneira de gerar funções
  intermediárias que aceitam parâmetros adicionais
  para completar um cálculo."

9 Curry em R (com o pacote functional)

library(functional)
mult <- function(a, b)
{
    return(a*b);
}
dobra <- Curry(mult, a=2)
tripla <- Curry(mult, a=3)

dobra(10)
tripla(10)
[1] 20
[1] 30