class: center, middle, inverse, title-slide # Uso de funcionais em R: evitando loops e seus benefícios ### Prof. Dr. Pedro Rafael Diniz Marinho ### Departamento de Estatística - UFPB ### 29 de maio de 2020 --- --- background-image: url("img/logo-texto.png") background-size: 200px background-position: 100% 0% # Sigam-nos nas redes sociais .pull-left[
] -- .fadeInLeft.animated[ .pull-right[ #### Prof. Dr. Pedro Rafael D. Marinho: [
**pedro.rafael.marinho@gmail.com**](mailto:pedro.rafael.marinho@gmail.com)</br> [
**Meu GitHub: https://github.com/prdm0**](https://github.com/prdm0)</br> [
**@prdm.0**](https://www.instagram.com/prdm.0/)</br> [
**@Pedro_Rafael1**](https://twitter.com/Pedro_Rafael1) #### Redes sociais e outras informações do Departamento de Estatística da UFPB: [
**Site do Departamento**: **http://www.de.ufpb.br/**](http://www.de.ufpb.br/) [
**@estatisticaufpb**](https://www.instagram.com/estatisticaufpb/) [
**@estatisticaufpb**](https://twitter.com/estatisticaufpb) [
**GitHub do DE: https://github.com/de-ufpb**](https://github.com/de-ufpb) ]] --- background-position: 100% 0% class: inverse, center, middle # Pré-requisitos para o acompanhamento dessa palestra --- background-image: url("img/logo-texto.png") background-size: 200px background-position: 100% 0% # O que devo conhecer em R? O espectador deverá ter algum contato no que se refere à programação em linguagem **R**. Alguns aspectos importantes são: -- - Principais estruturas de dados em **R**; - Instruções de condição: `if`, `else` e `switch`; - Emprego dos operadores `break` e `next`; - Instruções de repetição: `for`, `while` e `repeat`. -- ## O que devo instalar a priori? Ter a linguagem de programação **R** instalada; </br> Instalar o pacote [**purrr**](https://purrr.tidyverse.org/) instalado e carregado: .fadeInDownBig.animated[ ```r install.packages("purrr") library(purrr) ``` ] --- background-image: url("img/logo-texto.png") background-size: 200px background-position: 100% 0% # Caso julge não ter os pré-requisitos -- .pull-left[ - Livro de Estatística Computacional do Prof. Pedro Rafael: </br> [* **https://prdm0.github.io/aulas_computacional/** *](https://prdm0.github.io/aulas_computacional/); </br> - Meus slides da disciplina de Programação em linguagem R: </br> [* **https://prdm0.github.io/aulas_computacional/aulas_r.pdf** *](https://prdm0.github.io/aulas_computacional/aulas_r.pdf);</br> - Livro Advanced R, Ed. 2, escrito por Hadley Wickham: </br> [* **https://adv-r.hadley.nz/** *](https://adv-r.hadley.nz/) ; </br> - Livro básico em língua portuguesa de programação em R escrito por Luiz Torgo: </br> [* **https://cran.r-project.org/doc/contrib/Torgo-ProgrammingIntro.pdf** *](https://cran.r-project.org/doc/contrib/Torgo-ProgrammingIntro.pdf);</br> - Manuais da Linguagem R: </br> [* **https://cran.r-project.org/manuals.html** *](https://cran.r-project.org/manuals.html). ] .fadeInDownBig.animated[ .pull-right[ <img src="img/estudo.gif" width="350px" height="350px" style="display: block; margin: auto;" /> ]] --- background-position: 100% 0% class: inverse, center, middle # Programação Funcional <img src="img/lambda.gif" width="250px" height="200px" style="display: block; margin: auto;" /> --- background-image: url("img/logo-texto.png") background-size: 200px background-position: 100% 0% </br></br> .pull-left[ <blockquote> "*Para se tornar significativamente mais confiável, o código deve se tornar mais transparente. Em particular, condições e loops aninhados devem ser vistos com grande suspeita. Fluxos de controle complicados confundem os programadores. Código confuso geralmente oculta bugs.*" </blockquote> .right[-- <cite>**Bjarne Stroustrup**</cite>] </br></br></br></br> .font50[**Nota**: C++ **não** é uma linguagem de programação de paradigma funcional. C++ é uma linguagem multiparadigma mas que sobre todos os possíveis paradigmas prevalece a Orientação à Objeto - OO. Porém, a frase de seu criador se encaixa como filosofia para uso de funcionais. ]] -- .fadeInLeft.animated[ .pull-right[ </br> <div class="figure" style="text-align: center"> <img src="img/bjarne.jpg" alt="Bjarne Stroustrup, criador da Linguagem de Programação C++." width="430cm" height="300px" /> <p class="caption">Bjarne Stroustrup, criador da Linguagem de Programação C++.</p> </div> ]] --- background-position: 100% 0% class: inverse, center, middle # R é uma linguagem de programação multiparadigma --- background-image: url("img/logo-texto.png") background-size: 200px background-position: 100% 0% -- .fadeInLeft.animated[ <div class="figure" style="text-align: center"> <img src="img/chambers.png" alt="Chambers, John M. Object-oriented programming, functional programming and R. Statistical Science. (2014). 167-180." width="470cm" height="600px" /> <p class="caption">Chambers, John M. Object-oriented programming, functional programming and R. Statistical Science. (2014). 167-180.</p> </div> ] --- background-image: url("img/logo-texto.png") background-size: 200px background-position: 100% 0% # O que linguagens funcionais permite e que **R** também permite? -- - Funções podem ser enxergada uma estrutura de dados qualquer; -- - Podemos passar funções para variáveis; -- - Podemos passar funções para listas; -- - Podemos definir funções dentro de funções; -- - Podemos passar funções como argumentos de outras funções e obter como retorno um vetor, isto é, poderemos utilizar/escrever **funcionais**; -- - Podemos devolver funções como resultados de funções, a exemplo dos **closures**. </br> -- .fadeInDownBig.animated[ A rigor, **R** não é uma linguagem funcional pois linguagens funcionais exigem que venhamos escrever funções puras, isto é, funções que sempre devolvem o mesmo resultados. No entanto, adotar o estilo de programação funcional poderá oferecer diversas vantangens. Dividir o problema entre funções puras e funções impuras tende levar a criação de códigos mais fáceis de entender. ] --- background-image: url("img/logo-texto.png") background-size: 200px background-position: 100% 0% </br> .pull-left[ <blockquote> "*É difícil descrever exatamente o que é um estilo funcional, mas geralmente acho que isso significa decompor um grande problema em pedaços menores e depois resolver cada peça com uma função ou combinação de funções. Ao usar um estilo funcional, você se esforça para decompor os componentes do problema em funções isoladas que operam independentemente. Cada função assumida por si só é simples e direta de entender; a complexidade é tratada compondo funções de várias maneiras.*" </blockquote> .right[-- <cite>**Hadley Wickham - Advanced R, Ed. 2**</cite>] ] -- </br></br></br></br> .fadeInLeft.animated[ .pull-right[ <div class="figure" style="text-align: center"> <img src="img/hadley.png" alt="Hadley Wickham." width="380cm" height="400px" /> <p class="caption">Hadley Wickham.</p> </div> ]] --- background-position: 100% 0% class: inverse, center, middle # O que eu ganho em considerar aprender a utilizar funcionais? --- background-image: url("img/logo-texto.png") background-size: 200px background-position: 100% 0% # Vantagens dos funcionais </br> .pull-left[ - O código ficará mais **limpo** e **elegante**; </br></br> - O código ficará mais fácil de **manter** e **debugar**; </br></br> - Utilizando os funcionais disponíveis pelo **r-base** ou por pacotes como o **purrr**, **parallel**, **furrr** ou qualquer outro pacote que implemente funcionais de forma eficientes, você poderá tornar o seu código computacionalmente mais **eficaz**; </br></br> - É fácil **paralelizar** códigos usando funcionais. Tudo poderá ser feito sem grandes modificações do código original. Isso é uma grande vantagem. ] -- .fadeInDownBig.animated[ .pull-right[ <div class="figure" style="text-align: center"> <img src="img/bom.gif" alt="Você gostou dos benefícios do uso de funcionais?" width="300px" height="300px" /> <p class="caption">Você gostou dos benefícios do uso de funcionais?</p> </div> ]] --- background-image: url("img/logo-texto.png") background-size: 200px background-position: 100% 0% # Evite códigos em forma de espaguete .pull-left[ - Se você estiver fazendo algo mais de uma vez, ele deverá pertencer à uma função; - Na Programação Funcional - PF, todas as ações são apenas implementações de funções que você escreveu (composição de funções); - Tentar se aproximar da PF irá fazer com que você substitua longos blocos de códigos por chamada de funções, reduzindo **código espaguete**; - Não é regra, mas se você está escrevendo loops em excesso em **R**, você tem grandes chances de estar fazendo algo errado; - Evite muitas condições aninhadas para não cair em uma **pirâmide de destruição**; - O uso de funcionais se torna fácil quando você não tem códigos **espaguete**. ] .fadeInDownBig.animated[ .pull-right[ <div class="figure" style="text-align: center"> <img src="img/espaguete.png" alt="Evite códigos em forma de espaguete." width="400px" height="380px" /> <p class="caption">Evite códigos em forma de espaguete.</p> </div> ]] --- background-image: url("img/logo-texto.png") background-size: 200px background-position: 100% 0% <div class="figure" style="text-align: center"> <img src="img/purrr_hex.png" alt="Hex do pacote purrr." width="360cm" height="380px" /> <p class="caption">Hex do pacote purrr.</p> </div> O pacote **purrr** ([**https://github.com/tidyverse/purrr**](https://github.com/tidyverse/purrr)), entrega para quem trabalha com estatística, diversos funcionais que são de grande utilidade na implementação de códigos. Esses funcionais somado com os funcionais do **r-base** são ferramentas essenciais para quem deseja produzir códigos eficientes em **R**. Alguns detalhes sobre o uso do pacote **purrr** poderá ser encontrado no livro Advanced R, citado anteriormente, em [**https://adv-r.hadley.nz/functionals.html**](https://adv-r.hadley.nz/functionals.html). --- background-image: url("img/logo-texto.png") background-size: 200px background-position: 100% 0% # Funcionais não muito úteis .bounceInUp.animated[ .scroll-box-7[ .code70[ ```r # A função f() é um funcional. f <- function(x, func) func(x) # Passando uma função à f() por meio do argumento func. # Foi passado à func uma função anônima. f(x = c(1, 2, 7, 10), func = function(x) x + 1) ``` ``` ## [1] 2 3 8 11 ``` ]]] .bounceInUp.animated[ .scroll-box-11[ .code70[ ```r set.seed(0) f <- function() mean(runif(n = 10, min = 0, max = 1)) # A função loop() é um funcional. loop <- function(x, func) { resultado <- NULL for (i in seq_along(x)) resultado <- c(resultado, func()) resultado } loop(x = 1:3, func = f) ``` ``` ## [1] 0.6350050 0.4872545 0.4620326 ``` ]]] --- background-position: 100% 0% class: inverse, center, middle # Solucionando um problema com o uso de funcionais --- background-image: url("img/programando.gif") background-size: cover --- background-image: url("img/logo-texto.png") background-size: 200px background-position: 100% 0% # Uso de funcionais em um problema hipotético </br> .fadeInDownBig.animated[ Seja `\(G\)` uma distribuição de probabilidade qualquer com vetor de parâmetros `\(\xi\)` e `\(F\)` uma função de distribuição tal que, dado o conhecimento de `\(G\)`, temos que: `$$F(x; \theta) = G^a(x),$$` </br> com `\(\theta = (\xi, a)\)`, tal que `\(a > 0\)` e `\(x>0\)`. Diremos que uma v.a. tal que `\(X \sim F\)` segue distribuição **Exp-G**. </br> Dado `\(G\)`, realize uma simulação de **Monte-Carlo - MC** para estudar o viés dos **estimadores numéricos de máxima verossimilhança** obtidos pelo método **Nelder-Mead** para os parâmetros que indexam a distribuição `\(F\)`. Nas iterações de **MC**, considere obter os cenários provenientes da distribuição `\(G\)`. ] --- background-image: url("img/logo-texto.png") background-size: 200px background-position: 100% 0% # O que será feito? </br> -- .fadeInDownBig.animated[ - Uso do conceito de **funções anônimas** e **closures** para a escrita generalizada de `\(F\)`; </br></br> - Uso de **funcionais** para iterar o procedimento de **MC**; </br></br> - **Paralelização** do código; </br></br> - Introdução de uma **barra de progresso** mensurando o tempo de término da simulação de **MC**; </br></br> - Outros detalhes serão apresentados no código. ] </br> **<center>Indo para o RStudio ...</center>** --- background-image: url("img/logo-texto.png") background-size: 200px background-position: 100% 0% # Processador com múltiplos núcleos </br> <div class="figure" style="text-align: center"> <img src="img/processador_threads.png" alt="Imagem ilustrativa de um processador multicore." width="420cm" height="380px" /> <p class="caption">Imagem ilustrativa de um processador multicore.</p> </div> --- background-image: url("img/logo-texto.png") background-size: 200px background-position: 100% 0% # Referências </br> [1] Burns, Patrick. **The R inferno**. Lulu. com, 2011.</br></br> [2] Chambers, John M. **Object-oriented programming, functional programming and R**. Statistical Science 29.2 (2014): 167-180. </br></br> [3] McCallum, Ethan, and Stephen Weston. **Parallel R**. O'Reilly Media, Inc., 2011.</br></br> [4] R Core Team. R: **A Language and Environment for Statistical Computing**. R Foundation for Statistical Computing, Vienna, Austria, 2016. URL [**https://www.R-project.org/**](https://www.R-project.org/). ISBN 3-900051-07-0.</br></br> [5] Wickham, Hadley. **Advanced r**. CRC press, 2019.</br></br> --- background-image: url("img/aplausos.gif") background-size: cover