Operações básicas
# Soma
1 + 1
## [1] 2
# Subtração
2 - 3
## [1] -1
# Multiplicação
2 * 3
## [1] 6
# Divisão
6 / 4
## [1] 1.5
# Divisão Inteira
6 %/% 4
## [1] 1
# Resto da Divisão
6 %% 4
## [1] 2
# Potenciação
2 ^ 3
## [1] 8
8 ^ (1 / 3)
## [1] 2
Objetos no R
Para criar um objeto, atribuímos algo (neste caso, um valor) a um nome por meio do operador de atribuição <- ou =:
obj1 <- 5
obj2 = 5 + 2
Note que ambos objetos foram criados e aparecem no quadrante superior/direito (Environment). Agora, podemos imprimir os seus valores executando o nome do objeto
obj1
## [1] 5
ou imprimindo explicitamente por meio da função print():
print(obj2)
## [1] 7
Note que, podemos alterar um objeto atribuindo algo novo a ele:
obj1 = obj2
obj1
## [1] 7
Uma forma bastante utilizada para alteração de valor de um objeto é utilizando o próprio valor de objeto como base:
obj1 = obj1 + 3
obj1
## [1] 10
Isto será especialmente relevante quando trabalharmos com repetições/loops.
É possível visualizar o tipo de objeto usando a função class():
class(obj1)
## [1] "numeric"
Logo, obj1 é um número real. Há 5 tipos de classes de objetos “atômicos” (que contêm apenas 1 valor):
character: textonumeric: número realinteger: número inteirocomplex: número complexological: verdadeiro/falso (1 ou 0)
num_real = 3
class(num_real)
## [1] "numeric"
num_inteiro = 3L # para número inteiro, usar sufixo L
class(num_inteiro)
## [1] "integer"
texto = "Oi"
print(texto)
## [1] "Oi"
class(texto)
## [1] "character"
boolean = 2>1
print(boolean)
## [1] TRUE
class(boolean)
## [1] "logical"
boolean2 = T # poderia escrever TRUE
print(boolean2)
## [1] TRUE
boolean3 = F # poderia escrever FALSE
print(boolean3)
## [1] FALSE
Expressões lógicas/booleanas
São expressões que retornam o valor Verdadeiro ou Falso:
class(TRUE)
## [1] "logical"
class(FALSE)
## [1] "logical"
T + F + T + F + F # soma de 1's (TRUE) e 0's (FALSE)
## [1] 2
2 < 20
## [1] TRUE
19 >= 19
## [1] TRUE
100 == 10^2
## [1] TRUE
100 != 20*5
## [1] FALSE
É possível escrever expressões compostas utilizando | (ou) e & (e):
x = 20
x < 0 | x^2 > 100
## [1] TRUE
x < 0 & x^2 > 100
## [1] FALSE
Tabela de Precedência de Operadores
- Nível 6 - potenciação:
^- Nível 5 - multiplicação:
*,/,%/%,%%- Nível 4 - adição:
+,-- Nível 3 - relacional:
==,!=,<=,>=,>,<- Nível 2 - lógico:
&(e)- Nível 1 - lógico:
|(ou)
Vetores
Depois das 5 classes de objetos apresentadas acima, as mais básicas são os vetores e as listas, que possuem mais de um elemento dentro do objeto. Um vetor necessariamente exige que os elementos sejam da mesma classe. Podemos criar um vetor usando a função c() e incluindo os valores separados por ,:
x = c(0.5, 0.6) # numeric
x = c(TRUE, FALSE) # logical
x = c("a", "b", "c") # character
x = 9:12 # integer (é igual a c(9, 10, 11, 12))
x = c(1+0i, 2+4i) # complex
Se utilizarmos a função c() com elementos de classes diferentes, o R transforma a classe do objeto para o “mais geral”:
y = c(1.7, "a") # (numeric, character) -> character
class(y)
## [1] "character"
y = c(FALSE, 0.75) # (logical, numeric) -> numeric
class(y)
## [1] "numeric"
y = c("a", TRUE) # (character, logical) -> character
class(y)
## [1] "character"
Note que:
character > complex > numeric > integer > logical
Também podemos forçar a mudança de classe de objeto para a classe “menos geral”, o que acaba transformando:
- os elementos “mais gerais” em missing values (NA’s),
as.numeric(c(1.7, "a")) # (numeric, character)
## Warning: NAs introduzidos por coerção
## [1] 1.7 NA
as.logical(c("a", TRUE)) # (character, logical)
## [1] NA TRUE
- [exceção] de character com número (por exemplo, “9”) para numeric: torna-se numeric
as.numeric(c(1.7, "9")) # (numeric, character número)
## [1] 1.7 9.0
- [exceção] de numeric diferente de zero para logical: torna-se TRUE
- [exceção] de numeric igual a zero para logical: torna-se FALSE
as.logical(c(FALSE, 0.75, -10)) # (logical, numeric > 0, numeric < 0)
## [1] FALSE TRUE TRUE
as.logical(c(TRUE, 0)) # (logical, numeric zero)
## [1] TRUE FALSE
- [exceção] de character lógico (“TRUE”, “T”, “FALSE”, “F”) para logical: torna-se logical (“0” e “1” tornam-se NA)
as.logical(c("T", "FALSE", "1", TRUE)) # (character TRUE/FALSE, logical)
## [1] TRUE FALSE NA TRUE
Construção de vetor de sequência
- Uma forma interessante de construir um vetor numérico com uma sequência é utilizando a função
seq()
seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)),
length.out = NULL, ...)
- from, to: the starting and (maximal) end values of the sequence.
- by: number, increment of the sequence.
- length.out (length): desired length of the sequence.
- Note que todos argumentos já possuem valores pré-definidos, então podemos montar sequências de maneiras distintas.
- Considerando o preenchimento dos argumentos
frometo, podemos:- definir
bypara dar um valor de quanto varia entre um elemento e outro, ou - definir
length.out(ou simplesmentelength) para informar a quantidade de elementos que terá na sequência
- definir
seq(from=0, to=10, by=2)
## [1] 0 2 4 6 8 10
seq(from=0, to=10, length=5)
## [1] 0.0 2.5 5.0 7.5 10.0
Construção de vetor com elementos repetidos
- Podemos construir vetores com elementos repetidos usando a função
rep()
rep(x, times)
- x: a vector (of any mode including a list) or a factor.
- times: an integer-valued vector giving the (non-negative) number of times to repeat each element, or to repeat the whole vector.
rep(0, 10) # repetição de 10 zeros
## [1] 0 0 0 0 0 0 0 0 0 0
rep(c("a", "b"), 2) # repetição do vetor c("a", "b")
## [1] "a" "b" "a" "b"
Matrizes
Matrizes também possuem elementos de mesma classe, mas bidimensional. Uma matriz pode ser criada usando a função matrix():
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, ...)
- data: an optional data vector (including a list or expression vector). Non-atomic classed R objects are coerced by as.vector and all attributes discarded.
- nrow: the desired number of rows.
- ncol: the desired number of columns.
- byrow: logical. If FALSE (the default) the matrix is filled by columns, otherwise the matrix is filled by rows.
# matriz de NAs
m = matrix(nrow=2, ncol=3)
m
## [,1] [,2] [,3]
## [1,] NA NA NA
## [2,] NA NA NA
# matriz de 0s
m = matrix(0, 2, 3)
m
## [,1] [,2] [,3]
## [1,] 0 0 0
## [2,] 0 0 0
É possível construir uma matriz “preenchida” informando os seus (nº linhas $\times$ nº colunas) valores por meio de um vetor. Os elementos deste vetor preenchem primeiro todas linhas de uma coluna para, depois, preencher a próxima coluna (column-wise):
m = matrix(1:6, nrow=2, ncol=3)
m
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
Outra maneira de criar matrizes é juntando vetores em colunas (column-binding) ou em linhas (row-binding), usando as funções cbind() e rbind(), respectivamente:
x = 1:3
y = 10:12
cbind(x, y) # juntando por coluna
## x y
## [1,] 1 10
## [2,] 2 11
## [3,] 3 12
rbind(x, y) # juntando por linha
## [,1] [,2] [,3]
## x 1 2 3
## y 10 11 12
Arrays
Arrays são “matrizes” com mais de duas dimensões.
array(data = NA, dim = length(data), dimnames = NULL)
- data: a vector (including a list or expression vector) giving data to fill the array. Non-atomic classed objects are coerced by as.vector.
- dim: the dim attribute for the array to be created, that is an integer vector of length one or more giving the maximal indices in each dimension.
- dimnames: either NULL or the names for the dimensions.
# arrays de NAs de dimensões 1 x 2 x 3
a = array(dim=c(1, 2, 3))
a
## , , 1
##
## [,1] [,2]
## [1,] NA NA
##
## , , 2
##
## [,1] [,2]
## [1,] NA NA
##
## , , 3
##
## [,1] [,2]
## [1,] NA NA
# matriz preenchida de dimensões 1 x 2 x 3
a = array(1:6, c(1, 2, 3))
a
## , , 1
##
## [,1] [,2]
## [1,] 1 2
##
## , , 2
##
## [,1] [,2]
## [1,] 3 4
##
## , , 3
##
## [,1] [,2]
## [1,] 5 6
Listas
Já uma lista permite que os valores pertençam a classes distintas, inclusive podendo conter um vetor como elemento. Ela pode ser criada por meio da função list():
x = list(1, "a", TRUE, 1+4i, c(0.5, 0.6))
x
## [[1]]
## [1] 1
##
## [[2]]
## [1] "a"
##
## [[3]]
## [1] TRUE
##
## [[4]]
## [1] 1+4i
##
## [[5]]
## [1] 0.5 0.6
class(x)
## [1] "list"
Data frames
-
É um tipo especial de lista, em que cada elemento da lista possui o mesmo tamanho
-
Cada elemento da lista pode ser entendida como uma coluna de uma base de dados
-
Diferente de matrizes, cada elemento de um data frame pode ser de uma classe diferente
-
Normalmente é criada automaticamente ao carregarmos uma base de dados em .txt ou .csv via
read.table()ouread.csv() -
Mas também pode ser criada manualmente via
data.frame()
data.frame(...)
... : these arguments are of either the form value or tag = value
x = data.frame(foo=1:4, bar=c(T, T, F, F))
x
## foo bar
## 1 1 TRUE
## 2 2 TRUE
## 3 3 FALSE
## 4 4 FALSE
nrow(x) # Número de linhas de x
## [1] 4
ncol(x) # Número de colunas de x
## [1] 2
Importando data frames
- Reading tabular data (John Hopkins/Coursera)
- Para leitura de base de dados, as funções mais utilizadas são
read.table()eread.csv() - O
read.table()tem o seguinte argumentos (que também podem ser visto nas demais funções de leitura de base de dados):file: caminho/endereço do arquivo, incluindo a sua extensãoheader:TRUEouFALSEindicando se a 1ª linha da base de dados é um cabeçalhosep: indica como as colunas são separadasstringAsFactors:TRUEouFALSEse as variáveis de texto devem ser transformadas em factors.
data_txt = read.table("mtcars.txt") # também lê .csv
data_csv = read.csv("mtcars.csv")
- Caso queira testar, faça download das bases: mtcars.txt e mtcars.csv
- Note que, caso você não tenha definido o diretório de trabalho, é necessário informar o caminho/endereço inteiro do arquivo que você quer importar:
data = read.table("C:/Users/Fabio/OneDrive/FEA-RP/mtcars.csv")
read.csv()é igual aoread.table(), mas considera como padrão que o separador de colunas é a vírgula (sep = ",")- Para gravar uma base de dados, utilizamos as funções
write.csv()ewrite.table(), nas quais informamos um data frame e o nome do arquivo (junto de sua extensão).
Importando em outros formatos
- Para abrir arquivos em Excel, nos formatos .xls e xlsx, é necessário utilizar o pacote
xlsx
read.xlsx("mtcars.xlsx", sheetIndex=1) # Lendo a 1ª aba do arquivo Excel
Caso queira testar, faça download da base mtcars.xlsx
- Para abrir arquivos de SPSS, Stata e SAS, é necessário utilizar o pacote
havene, respectivamente, as funçõesread_spss(),read_dta()eread_sas()
Note que no padrão do R, o separador decimal é o ponto (
.), enquanto no padrão brasileiro usa-se vírgula.Isso pode gerar importação equivocada dos valores, caso o .csv ou o .xlsx tenham sido gerados no padrão brasileiro.
Para contornar este problema, utilize as funções de importação
read.csv2()eread.xlsx2()para que os dados sejam lidos a partir do padrão brasileiro e os dados sejam importados corretamente Caso queira testar, faça download das bases: mtcars_br.csv e mtcars_br.xlsx
Extraindo Subconjuntos
- Subsetting - Basics (John Hopkins/Coursera)
- Há 3 operadores básicos para extrair subconjuntos de objetos no R:
[]: retorna um “sub-objeto” da mesma classe do objeto original[[]]: usado para extrair elementos de uma lista ou data frame, em que o “sub-objeto” não é necessariamente da mesma classe do objeto original$: usado para extrair elemento de uma lista ou data frame pelo nome
Subconjunto de vetores
x = c(1, 2, 3, 3, 4, 1)
x[1] # extraindo o 1º elemento de x
## [1] 1
x[1:4] # extraindo do 1º ao 4º elemento de x
## [1] 1 2 3 3
- Note que, ao fazer uma expressão lógica com um vetor, obtemos um vetor lógico
x > 1
## [1] FALSE TRUE TRUE TRUE TRUE FALSE
- Usando o operador
[], podemos extrair um subconjunto do vetorxusando uma condição. Por exemplo, vamos extrair apenas valores maiores do que 1:
x[x > 1]
## [1] 2 3 3 4
x[c(F, T, T, T, T, F)] # Equivalente ao x[x > 1] - Extrair apenas TRUE's
## [1] 2 3 3 4
Subconjunto de listas
- Subsetting - Lists (John Hopkins/Coursera)
- Note que, diferente do vetor, para acessar um valor/elemento de uma lista é necessário utilizar
[[]]com o número da posição do elemento da lista
x = list(foo=1:4, bar=0.6)
x
## $foo
## [1] 1 2 3 4
##
## $bar
## [1] 0.6
x[1] # retorna a lista foo
## $foo
## [1] 1 2 3 4
class(x[1])
## [1] "list"
x[[1]] # retorna o vetor foo de classe numeric
## [1] 1 2 3 4
class(x[[1]])
## [1] "integer"
- Se quiser acessar um elemento dentro deste elemento da lista, precisa ser seguido por
[]
x[[1]][2]
## [1] 2
x[[2]][1]
## [1] 0.6
- Também podemos usar o nome para extrair um subconjunto do objeto
x[["foo"]]
## [1] 1 2 3 4
x$foo
## [1] 1 2 3 4
Subconjunto de matrizes e de data frames
- Subsetting - Matrices (John Hopkins/Coursera)
- Para extrair um pedaço de uma matriz ou de um data frame, indicamos as linhas e as colunas dentro do operador
[]
x = matrix(1:6, 2, 3)
x
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
x[1, 2] # linha 1 e coluna 2 da matriz x
## [1] 3
x[1:2, 2:3] # linha 1 e colunas 2 e 3 da matriz x
## [,1] [,2]
## [1,] 3 5
## [2,] 4 6
- É possível selecionar linhas/colunas usando um vetor lógico (
TRUE’s eFALSE’s) de mesmo comprimento da dimensão:
x[, c(F, T, T)] # vet. lógico selecionando as 2 últimas colunas
## [,1] [,2]
## [1,] 3 5
## [2,] 4 6
- Podemos selecionar linhas ou colunas inteiras ao não informar os índices:
x[1, ] # linha 1 e todas colunas
## [1] 1 3 5
x[, 2] # todas linhas e coluna 2
## [1] 3 4
- O mesmo pode ser utilizado para arrays, porém com mais dimensões
x = array(1:16, c(1, 2, 3)) # array com 3 dimensões
x
## , , 1
##
## [,1] [,2]
## [1,] 1 2
##
## , , 2
##
## [,1] [,2]
## [1,] 3 4
##
## , , 3
##
## [,1] [,2]
## [1,] 5 6
x[1, 1, 2] # extraindo valor com índices (1, 1, 2)
## [1] 3
Removendo valores ausentes (NA)
- Subsetting - Removing missing values (John Hopkins/Coursera)
- Remover dados faltantes é uma ação comum quando manipulamos bases de dados
- Para verificar quais dados são
NA, usa-se a funçãois.na()
x = c(1, 2, NA, 4, NA, NA)
is.na(x)
## [1] FALSE FALSE TRUE FALSE TRUE TRUE
sum(is.na(x)) # qtd de missing values
## [1] 3
- Relembre que o operador
!nega uma expressão e, portanto,!is.na()nos resulta os elementos que não são ausentes
x[ !is.na(x) ]
## [1] 1 2 4
Estatísticas básicas
- Valores Absolutos:
abs()
x = c(1, 4, -5, 2, 8, -2, 4, 7, 8, 0, 2, 3, -5, 7, 4, -4, 2, 5, 2, -3)
x
## [1] 1 4 -5 2 8 -2 4 7 8 0 2 3 -5 7 4 -4 2 5 2 -3
abs(x)
## [1] 1 4 5 2 8 2 4 7 8 0 2 3 5 7 4 4 2 5 2 3
- Soma:
sum(..., na.rm = FALSE)
sum(x)
## [1] 40
- Média:
mean(x, trim = 0, na.rm = FALSE, ...)
mean(x)
## [1] 2
- Desvio Padrão:
sd(x, na.rm = FALSE)
sd(x)
## [1] 4.129483
- Quantis:
quantile(x, probs = seq(0, 1, 0.25), na.rm = FALSE, ...)
# Mínimo, 1º Quartil, Mediana, 3º Quartil e Máximo
quantile(x, probs=c(0, .25, .5, .75, 1))
## 0% 25% 50% 75% 100%
## -5.00 -0.50 2.00 4.25 8.00
- Máximo e Mínimo:
max(..., na.rm = FALSE)emin(..., na.rm = FALSE)
# Mínimo, 1º Quartil, Mediana, 3º Quartil e Máximo
max(x) # Valor máximo
## [1] 8
min(x) # Valor mínimo
## [1] -5
- Para obter os índices de todos os elementos iguais ao valor máximo/mínimo, podemos usar a função
which()que tem como argumento um vetor lógico (deTRUE’s eFALSE’s) como input, e gera um vetor/matriz de índices:
which(x, arr.ind = FALSE, ...)
- x: a logical vector or array. NAs are allowed and omitted (treated as if FALSE).
- arr.ind: logical; should array indices be returned when x is an array?
x == max(x) # vetor lógico (TRUE's são os máximos)
## [1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
which(x == max(x)) # vetor de índices de elementos com valores máximos
## [1] 5 9
x[which(x == max(x))] # valores máximos
## [1] 8 8
x[which(x == min(x))] # valores máximos
## [1] -5 -5
- Isso também é válido para matrizes, mas se quisermos ter o índice da linha e da coluna, precisamos usar o argumento
arr.ind = TRUE
x = matrix(1:6, nrow=2)
x
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
which(x == max(x)) # retorna um número único
## [1] 6
which(x == max(x), arr.ind = T) # retorna um vetor de números
## row col
## [1,] 2 3
- Note que, se houver valores ausentes (
NA), a função retornaNApor padrão. Para excluir os valores ausentes, precisamos definir o argumentona.rm = TRUE:
x = c(1, 4, -5, 2, NA, -2, 4, 7, NA, 0, 2, 3, -5, NA, 4, -4, NA, 5, 2, NA)
max(x) # Sem excluir valores ausentes
## [1] NA
max(x, na.rm=TRUE) # Excluindo valores ausentes
## [1] 7
Exemplo: Otimização de função univariada
- Queremos encontrar o $x$ que minimiza a função univariada $f(x) = x^2 + 4x - 4$, ou seja, $$ \text{arg} \min_x (x^2 + 4x - 4) $$
- Ver no Wolfram
- Para resolver numericamente, podemos chutar diversos valores de $x$ e pegar o menor valor
- Primeiro, vamos construir um vetor com diversos valores de $x$ no intervalo $[-5, 5]$.
x_grid = seq(-5, 5, length=20)
x_grid
## [1] -5.0000000 -4.4736842 -3.9473684 -3.4210526 -2.8947368 -2.3684211
## [7] -1.8421053 -1.3157895 -0.7894737 -0.2631579 0.2631579 0.7894737
## [13] 1.3157895 1.8421053 2.3684211 2.8947368 3.4210526 3.9473684
## [19] 4.4736842 5.0000000
- Agora, vamos calcular o valor de $f(x)$ para cada possível $x$
fx = x_grid^2 + 4*x_grid - 4
- Note que cada elemento calculado em
fx_gridcorresponde a um $x$ na mesma posição/índice emx_grid
head( cbind(x=x_grid, fx=fx), 6) # mostrando os 6 primeiros valores
## x fx
## [1,] -5.000000 1.000000
## [2,] -4.473684 -1.880886
## [3,] -3.947368 -4.207756
## [4,] -3.421053 -5.980609
## [5,] -2.894737 -7.199446
## [6,] -2.368421 -7.864266
- Agora, vamos ver o valor e a posição de $x$ que minimiza a função:
min(fx) # f(x) mínimo
## [1] -7.975069
argmin = which(fx == min(fx)) # índice de x que maximiza
argmin
## [1] 7
- Para recuperar o valor de
$x$ que minimiza
$f(x)$, precisamos usar o índice encontrado para encontrar no vetor
x_grid:
x_grid[argmin]
## [1] -1.842105
- Observe que podemos aumentar a precisão aumentando o número de possíveis valores de
$x$ no
x_grid. Por outro lado, em contas mais complexas, pode elevar muito o tempo de execução do comando.
Estruturas de controle
- Estruturas de controle no R permitem o controle do fluxo do programa
Condicional (if)
x = 5
if (x > 10) {
y = 10
} else if (x > 0) {
y = 5
} else {
y = 0
}
y
## [1] 5
- Essa mesma estrutura também pode atribuir diretamente um valor a um objeto
x = 5
y = if (x > 10) {
10
} else if (x > 0) {
5
} else {
0
}
y
## [1] 5
Repetição (for)
- Control structures - For loops (John Hopkins/Coursera)
- A repetição usando
forexige que você insira um vetor e defina um nome para a variável de indicação
for(i in 3:7) {
print(i)
}
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
- Acima, nomeamos a variável de indicação como
ie inserimos um vetor de números inteiros entre 3 e 7. - A cada iteração (loop) é atribuído ao
ium valor do vetor3:7, até “acabarem” todos os elementos do vetor - Sequências são interessantes para incluir em repetições utilizando
for
sequencia = seq(1, 5, length.out=11)
sequencia
## [1] 1.0 1.4 1.8 2.2 2.6 3.0 3.4 3.8 4.2 4.6 5.0
for (val in sequencia) {
print(val^2)
}
## [1] 1
## [1] 1.96
## [1] 3.24
## [1] 4.84
## [1] 6.76
## [1] 9
## [1] 11.56
## [1] 14.44
## [1] 17.64
## [1] 21.16
## [1] 25
Repetição (while)
- Control structures - While loops (John Hopkins/Coursera)
- Diferente do
for, a repetição viawhileexige que uma variável de indicação já esteja criada previamente antes de entrar no loop - Isto se dá, pois os loops (inclusive o primeiro) só serão realizados se uma condição for verdadeira
- Note que, por não seguir uma sequência de elemento dentro de um vetor (como no
for), é necessário que a variável de indicação seja atualizada a cada iteração para que a repetição não seja feita infinitamente. - Um forma comum de executar o
whileé definindo a variável de indicação como um contador, isto é, ir contando a quantidade de loops realizados e parar em uma determinada quantidade
contador = 0
while (contador <= 10) {
print(contador)
contador = contador + 1
}
## [1] 0
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
- Uma alternativa à variável de indicação que funciona como contador: valor a ser calculado em cada iteração até convergir (chegar a um valor muito pequeno) ou ultrapassar algum valor limite. No exemplo abaixo, a cada loop da variável de indicação
distanciadiminuirá pela metade e irá parar num valor bem próximo de 0 (algum valor menor do que\(10^{-3}\))
distancia = 10
tolerancia = 1e-3 # = 1 x 10^(-3) = 0.001
while (distancia > tolerancia) {
distancia = distancia / 2
}
distancia
## [1] 0.0006103516
Exemplo: Preenchendo matriz a partir de uma f(x,y)
- É comum o uso de uma estrutura de repetição dentro de outra estrutura de repetição (repetições encaixadas).
- Como exemplo, calcularemos a função $$ f(x,y) = 2x^2 - y^2 + 3xy, $$ para cada combinação de $x \in \boldsymbol{X}=\{ -5, -4, -3, ..., 3, 4, 5\}$ e de $y \in \boldsymbol{Y}=\{ 0, 2, 4, 6, 8, 10\} $.
Uma matriz será preenchida com os valores:
$$ \begin{pmatrix} f(-5, 0) & f(-5, 2) & \cdots & f(-5, 10) \\ f(-4, 0) & f(-4, 2) & \cdots & f(-4, 10) \\ \vdots & \vdots & \ddots & \vdots \\ f(5, 0) & f(5, 2) & \cdots & f(5, 10) \end{pmatrix} $$No R:
X = seq(-5, 5, by=1)
Y = seq(0, 10, by=2)
fxy = matrix(NA, nrow=length(X), ncol=length(Y)) # Criando matrix 11 x 6
# Preenchimento da matriz com a f(x,y)
for (i in 1:length(X)) {
# Dado um valor de linha, preenche todas colunas
for (j in 1:length(Y)) {
fxy[i, j] = 2*X[i]^2 - Y[j]^2 + 3*X[i]*Y[j]
}
# Terminada todas colunas de uma linha, começa novo loop na próxima linha
}
fxy
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 50 16 -26 -76 -134 -200
## [2,] 32 4 -32 -76 -128 -188
## [3,] 18 -4 -34 -72 -118 -172
## [4,] 8 -8 -32 -64 -104 -152
## [5,] 2 -8 -26 -52 -86 -128
## [6,] 0 -4 -16 -36 -64 -100
## [7,] 2 4 -2 -16 -38 -68
## [8,] 8 16 16 8 -8 -32
## [9,] 18 32 38 36 26 8
## [10,] 32 52 64 68 64 52
## [11,] 50 76 94 104 106 100
Criando funções
- Your first R function (John Hopkins/Coursera)
- Para criar uma função, usamos a função
function(){}:- dentro dos parêntesis
(), incluímos nomes de variáveis arbitrárias (argumentos/inputs) que serão utilizadas pela função para fazer cálculos - dentro das chaves
{}, usamos os nomes das variáveis arbitrárias definidas dentro do parêntesis para fazer cálculos e retornar um output (último valor dentro das chaves)
- dentro dos parêntesis
- Como exemplo, criaremos uma função que pega 2 números como inputs e retorna sua soma
soma = function(a, b) {
a^2 + b
}
- Ao atribuir a função ao objeto
somanão geramos resultados. Para fazer isso, usamos a funçãosoma()inserindo 2 números como inputs:
soma(10, 4)
## [1] 104
- Note que as variáveis arbitrárias
aebsão utilizadas apenas dentro da função
> a
Error: object 'a' not found
- Note que podemos inserir um valor padrão para um argumento de função. Como exemplo, criaremos uma função que retorna todos elementos acima de
nde um vetor dado:
vetor = 1:20
above = function(x, n = 10) {
x[x > n]
}
above(vetor) # todos acima do valor padrão 10
## [1] 11 12 13 14 15 16 17 18 19 20
above(vetor, 14) # todos acima de 14
## [1] 15 16 17 18 19 20