11 agosto, 2021

Selo DC

Linguagem, Programa ou ambiente R?

  • Linguagem interpretada (S, C, FORTRAN) R;
  • Software R;
  • Ambiente R (Melhor escolha!);

Ambiente R

Assim, esse ambiente inclui:

  • manipulação de dados;
  • operações com matrizes;
  • coleção de ferramentas para análise de dados;
  • criação e apresentações gráficas, para apresentação dos dados;
  • linguagem que inclui condicionais, fluxos de controle, funções recursivas definidas pelo usuário e recursos de entrada e saída;
  • Documentação e relatórios de análises.

Contexto amplo como linguagem e ambiente R

  • um ambiente de software livre e código aberto, com licença GNU;
  • uma linguagem de programação interpretada;
  • uma linguagem de programação dinâmica;
  • uma linguagem de tipagem forte e dinâmica;
  • uma linguagem de programação funcional;
    • de escopo lêxico;
    • execução preguiçosa;
  • uma linguagem de programação orientada a objetos; e
  • uma linguagem de programação metaparadigma.

Linguagem de programação dinâmica

  • O código é automaticamente interpretado, conforme se executa;
  • Avaliação dinâmica (expression(), eval(), quote(), substitute(), bquote(), desparse());
  • Manipulação de ambientes explicitamente;

Linguagem de programação fortemente e dinamicamente tipada

vetor <- TRUE; typeof(vetor)
## [1] "logical"
vetor[2] <- 1; typeof(vetor)
## [1] "double"
vetor[3] <- "1"; typeof(vetor); vetor
## [1] "character"
## [1] "1" "1" "1"

Linguagem de programação funcional

  • O R não é uma linguagem estritamente funcional, pois dentre outras situações, se entende que o estilo estritamente funcional apresenta:

    • Composição de funções ✔️;
    • Funções puras ✖️:
    • Imutabilidade ✖️;
    • Sem efeito colateral ✖️;
    • Funções de primeira classe ✔️;

Composição de funções

x <- 1:10
media <- function(x) mean(x)
media(x)
## [1] 5.5

Funções puras

  • Função pura
fpura <- function(x) {
  if (!is.numeric(x)) stop("x deve ser numérico")
  x + 1
}
fpura(x = 2)
## [1] 3
  • Função que não é pura
rnorm(n = 3)
## [1] -0.42782752 -0.38515145  0.05923715
rnorm(n = 3)
## [1] -0.2435890 -0.2996528  0.1943401

Imutabilidade

O R pode apresentar condições mutáveis:

# Criamos um vetor e associamos ao nome 'x'
x <- c(1, 2, 3)
# Vejamos o identificador de memória
lobstr::obj_addr(x)
# > "0xcf09be4708"
# Modificando no local
x[2] <- 4; x
# [1] 1 4 3
# Mesmo modificando o objeto, o identificador eh o mesmo
lobstr::obj_addr(x)
# > "0xcf09be4708"

Estilo funcional com Escopo léxico

  • Exemplo 1: As funções têm acesso ao escopo em que foram criadas
> # Criando um nome "n" associado a um objeto 10 no escopo da funcao
> n <- 10
> 
> # Criando um nome "funcao" associado a um objeto que eh uma funcao
> funcao <- function() {
+   print(n)
+ }
> 
> # Imprimindo 'funcao'
> funcao()
## [1] 10

Estilo funcional com Escopo léxico

  • Exemplo 2: As variáveis criadas ou alteradas dentro de uma função, permanecem na função
> # Criando n
> n <- 10
> lobstr::obj_addr(n) # Ident do objeto
## [1] "0x723f358"
> #Funcao
> funcao <- function() {
+   print(n) # Imprimindo n
+   n <- 15 # Criando n
+   print(n) # Imprimindo n
+ }
> # Imprimindo 'funcao'
> funcao()
## [1] 10
## [1] 15
> # Imprimindo 'n'
> n; lobstr::obj_addr(n) # Identificador do objeto
## [1] 10
## [1] "0x723f358"

Estilo funcional com Escopo léxico

  • Exemplo 3: As variáveis dentro de uma função permanecem nelas, exceto no caso em que a atribuição ao escopo seja explicitamente solicitada.
> # Criando n
> n <- 10
> lobstr::obj_addr(n) # Identificador do objeto
## [1] "0x10ba4f88"
> # Criando funcao
> funcao <- function() {
+   # Imprimindo n
+   print(n)
+   # Superatribuicao
+   n <<- 15
+   # Imprimindo n
+   print(n)
+ }
> # Imprimindo 'funcao'
> funcao()
## [1] 10
## [1] 15
> # Imprimindo n
> n; lobstr::obj_addr(n) # Ident do objeto
## [1] 15
## [1] "0x10ba4ea8"

Estilo funcional com avaliação preguiçosa

preguicoso <- function(a, b = faux())  a * 100
preguicoso(4)
## [1] 400

Funções de primeira classe

> # Funcao anonima
> function(x) x + 1 # 1ª forma
## function(x) x + 1
> \(x) x + 1        # 2ª forma (>= R 4.1) 
## \(x) x + 1
> # Funcao associado a um nome
> fx <- function(x) x + 1
> # Funcao como argumento de outra funcao
> x <- cbind(1:10)
> apply(x, 1, \(x) x + 1)
##  [1]  2  3  4  5  6  7  8  9 10 11
> # Operador binario (Pipe nativo)
> 1:10 |> mean()
## [1] 5.5

Programação orientada a objetos

# Objeto "data.frame"
objPOO <- data.frame(a = 1, b = "1", c = TRUE)
# Objeto "data.frame" eh um objeto POO?
is.object(objPOO)
## [1] TRUE
# Vetor de comprimento 10
objBASE <- 1:10
# O vetor eh um objeto POO?
is.object(objBASE)
## [1] FALSE

Polimorfismo

diamonds <- ggplot2::diamonds
summary(diamonds$carat)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.2000  0.4000  0.7000  0.7979  1.0400  5.0100
summary(diamonds$cut)
##      Fair      Good Very Good   Premium     Ideal 
##      1610      4906     12082     13791     21551

Bons estudos!