4 Aritmética e Objetos

4.1 Operações aritméticas

Você pode usar o R para avaliar algumas expressões aritméticas simples. Por exemplo:

> 1+2+3         # somando estes números ...

[1] 6

> 2+3*4         # um pouquinho mais complexo

[1] 14

> 3/2+1

[1] 2.5

> 4*3**3        # potências são indicadas por  ** ou ^

[1] 108

Nos exemplos acima mostramos uma operação simples de soma. Note no segundo e terceiro comandos a prioridade entre operações. No último vimos que a operação de potência é indicada por **. Note que alternativamente pode-se usar o símbolo ^, por exemplo 4*3^3 produziria o mesmo resultado mostrado acima.

O símbolo [1] pode parecer estranho e será explicado mais adiante. O R também disponibiliza funções usuais como as que são encontradas em uma calculadora:

> sqrt(2)

[1] 1.414214

> sin(3.14159)       # seno de (Pi radianos) é zero

[1] 2.65359e-06

Note que o ângulo acima é interpretado como sendo em radianos. O valor Pi está disponível como uma constante. Tente isto:

> sin(pi)

[1] 1.224647e-16

Aqui está uma lista resumida de algumas funções aritméticas no R:

sqrt() raiz quadrada
abs() valor absoluto (positivo)
sin() cos() tan() funções trigonométricas
asin() acos() atan() funções trigonométricas inversas
sinh() cosh() tanh() funções hiperbólicas
asinh() acosh() atanh() funções hiperbólicas inversas
exp() log() exponencial e logaritmo natural
log10() log2() logaritmo base-10 e base-2
gamma() função Gamma de Euler
factorial() fatorial (\(n!\))
choose() número de combinações \(\left (\frac {n!}{x!(n-x)!}\right )\)
combn() todas as combinações de um certo número de elementos

Estas expressões podem ser agrupadas e combinadas em expressões mais complexas:

> sqrt(sin(45*pi/180))
[1] 0.8408964

4.2 Valores faltantes e especiais

Vimos nos exemplos anteriores que pi é um valor especial, que armazena o valor desta constante matemática. O número de Euler \(e\) é obtido com exp(1).

> pi

[1] 3.141593

> exp(1)

[1] 2.718282

Existem ainda alguns outros valores especiais usados pelo R:

Vejamos no exemplo abaixo alguns resultados que geram estes valores especiais. No final desta sessão revisitamos o uso destes valores.

> sqrt(-1)

Warning in sqrt(-1): NaNs produzidos

[1] NaN

> Inf/10

[1] Inf

> Inf/Inf

[1] NaN

> c(-1,0,1)/0

[1] -Inf  NaN  Inf

No último comando usamos a função c() para criar um vetor de elementos \(-1\), \(0\) e \(1\) e a operação é dita ser vetorial por dividir cada um desses valores por \(0\).

4.3 Objetos

O R é uma linguagem funcional e vetorial que manipula objetos, no sentido em que variáveis, dados, matrizes, funções, etc, são armazenados na memória ativa do computador na forma de objetos. Por exemplo, se um objeto x tem o valor 10, ao digitarmos o seu nome, o programa exibe o valor do objeto:

> x <- 10 
> x

[1] 10

O dígito 1 entre colchetes indica que o conteúdo exibido inicia-se com o primeiro elemento do objeto x. Você pode armazenar um valor em um objeto com certo nome usando o símbolo <-. Exemplos:

> x <- sqrt(2)      # armazena a raiz quadrada de 2 em x 
> x                 # digite o nome do objeto para ver seu conteúdo

[1] 1.414214

> (x <- sqrt(2))    # cria e exibe o objeto

[1] 1.414214

Neste caso lê-se: x recebe a raiz quadrada de 2. Alternativamente ao símbolo <- usualmente utilizado para atribuir valores a objetos, pode-se ainda usar os símbolos -> ou = (este apenas em versões mais recentes do R). O símbolo _ que podia ser usado em versões mais antigas no R tornou-se inválido para atribuir valores a objetos em versões mais recentes e passou a ser permitido nos nomes dos objetos. As linhas a seguir produzem então o mesmo resultado.

> x <- sin(pi) 
> x

[1] 1.224647e-16

> sin(pi) -> x 
> x

[1] 1.224647e-16

> x = sin(pi) 
> x

[1] 1.224647e-16

Neste material será dada preferência ao primeiro símbolo. Usuários pronunciam o comando dizendo que o objeto "recebe" (em inglês "gets") um certo valor. Por exemplo em x <- sqrt(2) dizemos que "x recebe a raiz quadrada de 2". Como pode ser esperado você pode fazer operações aritméticas com os objetos.

> y <- sqrt(5)      # uma nova variável chamada y 
> y+x               # somando valores de x e y

[1] 2.236068

Note que ao atribuir um valor a um objeto o programa não imprime nada na tela. Digitando o nome do objeto o programa imprime seu conteúdo na tela. Digitando uma operação aritmética, sem atribuir o resultado a um objeto, faz com que o programa imprima o resultado na tela. Nomes de variáveis devem começar com uma letra e podem conter letras, números e pontos. Um fato importante é que o R distingue letras maiúsculas e minúsculas nos nomes dos objetos, por exemplo dados, Dados e DADOS serão interpretados como nomes de três objetos diferentes pela linguagem.
DICA: tente atribuir nomes que tenham um significado lógico, relacionado ao trabalho e dados em questão. Isto facilita lidar com um grande número de objetos. Ter nomes como a1 até a20 pode causar confusão. A seguir estão alguns exemplos válidos …

> x <- 25 
> x * sqrt(x) -> x1 
> x2.1 <- sin(x1) 
> xsq <- x2.1**2 + x2.1**2

…e alguns que NÃO são válidos.

99a <- 10 
a1 <- sqrt 10 
a-1 <- 99 
sqrt(x) <- 10

No primeiro caso o nome não começa com uma letra, o que é obrigatório, a99 é um nome válido, mas 99a não é. No segundo faltou um parêntese na função sqrt, o correto seria sqrt(10). No terceiro caso o hífen não é permitido, por ser o mesmo sinal usado em operações de subtração. No último caso, sqrt(x) <- 10 tem a forma de uma função de substituição (nome<-), mecanismo usado por comandos como names(x) <- ... ou dim(x) <- ...; como não existe uma função sqrt<-, o R retorna erro dizendo que não conseguiu encontrar esta função.

É ainda desejável, e às vezes crucial, evitar outros nomes que sejam de objetos do sistema (em geral funções, ou constantes tais como o número \(\pi \)) como, por exemplo:

 c q  s  t  C  D  F  I  T  diff  exp  log  mean  pi  range  rank  var

Nomes reservados: O R, como qualquer outra linguagem, possui nomes reservados, isto é, nomes que não podem ser utilizados para objetos por terem um significado especial na linguagem. São eles:

       FALSE  Inf  NA  NaN  NULL TRUE 
       break  else  for  function  if  in  next  repeat  while

Valores especiais revisitados: Vimos anteriormente os valores especiais NA, NaN e Inf. Estes valores podem ser atribuídos a objetos ou elementos de um objeto e pode-se ainda testar a presença destes valores em objetos ou seus elementos.

No exemplo a seguir definimos um vetor de valores e verificamos que o objeto criado não contém nenhum destes valores especiais. Note neste exemplo o uso do caracter ! que indica negação. As funções do tipo is.*() testam cada valor do vetor individualmente enquanto any() verifica a presença de algum valor que satisfaça a condição e all() verifica se todos os valores satisfazem a condição.

> x <- c(23, 34, 12, 11, 34) 
> is.na(x)

[1] FALSE FALSE FALSE FALSE FALSE

> !is.na(x)

[1] TRUE TRUE TRUE TRUE TRUE

> is.nan(x)

[1] FALSE FALSE FALSE FALSE FALSE

> is.finite(x)

[1] TRUE TRUE TRUE TRUE TRUE

> !is.finite(x)

[1] FALSE FALSE FALSE FALSE FALSE

> any(!is.finite(x))

[1] FALSE

> all(is.finite(x))

[1] TRUE

A seguir vamos substituir o terceiro dado 12 pelo código de dado faltante. Note ainda que operações envolvendo NA tipicamente retornam valor NA o que faz sentido uma vez que o valor não pode ser determinado, não está disponível.

> x[3] <- NA 
> x

[1] 23 34 NA 11 34

> is.na(x)

[1] FALSE FALSE  TRUE FALSE FALSE

> any(is.na(x))

[1] TRUE

> all(is.na(x))

[1] FALSE

> x+5

[1] 28 39 NA 16 39

> x/10

[1] 2.3 3.4  NA 1.1 3.4

> mean(x)

[1] NA

Agora vamos ver outros valores especiais.

> x1 <- (x - 34)/0 
> x1

[1] -Inf  NaN   NA -Inf  NaN

> is.finite(x1)

[1] FALSE FALSE FALSE FALSE FALSE

> !is.finite(x1)

[1] TRUE TRUE TRUE TRUE TRUE

> is.nan(x1)

[1] FALSE  TRUE FALSE FALSE  TRUE