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.224606e-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 logarítmo natural
log10() log2() logarítmo base-10 e base-2
gamma() função Gamma de Euler
factorial fatorial (n!)
choose() número de combinações ( --n!---
x!(n-x)! )
combn() todas conjuntos gerados pela combinações de 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. Existem ainda alguns outro 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.

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

  [1] -Inf  NaN  Inf

4.3 Objetos

O R é uma linguagem orientada à objetos: 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

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 o mesmo resultado.

  > x <- sin(pi)
  > x

  [1] 1.224606e-16

  > x <- sin(pi)
  > x

  [1] 1.224606e-16

  > x = sin(pi)
  > x

  [1] 1.224606e-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
  > x1 <- x * sqrt(x)
  > x2.1 <- sin(x1)
  > xsq <- x2.1^2 + x2.2^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 parentesis 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. O últio caso é um comando sem sentido.

É ainda desejável, e as vez crucial evitar ainda outros nomes que sejam de objetos do sistema (em geral funções, ou constantes tais como o número π) 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 que 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