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
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\).
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