R (linguagem de programação)/Estruturas de controle
Aqui, estruturas de controle se refere aos condicionais, laços etc, assim como às funções.
Condicionais
editar- Para obter ajuda sobre os controles condicionais ("se... então", etc):
> ?Control
O condicional mais básico é a estrutura "se... então... (senão...)":
if (condição) execução_principal else execução_alternativa
ou pode haver somente a condição para a execução principal:
if (condição) execução_principal
A condição do if é unidimensional, ou seja, deve conter apenas um retorno booleano explícito ou derivado de uma expressão:
- x == y "x é igual a y"
- x != y "x não é igual a y"
- x > y "x é maior que y"
- x < y "x é menor que y"
- x >= y "x é maior ou igual a y"
- x <= y "x é menor ou igual a y"
Dentro da condição pode haver combinações de expressões, desde que o conjunto respeite a unidimensionalidade da condição, usando os operadores:
- & ou && para E (AND)
- | ou || para OU (OR).
Aqui cabe uma observação relevante: por ser uma linguagem interpretada, o interpretador processa a linha até que encontre o que parece ser seu fim. Então, um pedaço de código como:
x <- 1 # ou x <- 2 - teste com os dois valores if (x == 1) y <- 2 else y <- 3
dará erro. O motivo é que, ao processar a linha
if (x == 1) y <- 2
o interpretador acha que a instrução terminou neste ponto, então a linha seguinte
else y <- 2
é interpretada como uma linha isolada - e else não existe exceto como parte do if.
Para evitar este tipo de erro, deve-se colocar o código a ser executado entre chaves - { e } depois dos ifs e elses.
if (condição) { execução_principal } else { execução_alternativa }
- A função ifelse() é uma função com três argumentos: o primeiro é a condição a ser testada (uma variável lógica), e os dois seguintes são os valores assumidos no caso verdadeiro e no caso falso. Note-se que a condição pode ser uma variável lógica simples, ou um vetor.
- Neste exemplo, gera-se uma sequência de 1 a 10, e são zerados os valores entre 5 e 8:
> x <- 1:10 > ifelse(x<5 | x>8, x, 0) [1] 1 2 3 4 0 0 0 0 9 10
Laços (loops)
editarEm R existem três formas de fazer loops: for, repeat e while.
- O comando for é o mais simples - mas pode parecer estranho para quem está acostumado com a linguagem C. É preciso definir um vetor de valores, e dizer que a variável que sofre o for está neste vetor:
> for (k in 1:5){ + print(k) + } [1] 1 [1] 2 [1] 3 [1] 4 [1] 5
Note-se que, em quase todos os casos onde o for é usado, uma programação baseada em vetores é bem mais eficiente.
- Quando não for possível usar a instrução for, pode-se usar repeat e while.
Nos dois exemplos abaixo são mostrados valores da distribuição normal padronizada, desde que eles sejam menores que um. A função cat() é usada para mostrar os valores na tela.
> repeat { + g <- rnorm(1) + if (g > 1.0) break + cat(g,"\n") + } -1.214395 0.6393124 0.05505484 -1.217408
> g <- 0 > while (g < 1){ + g <- rnorm(1) + cat(g,"\n") + } -0.08111594 0.1732847 -0.2428368 0.3359238 -0.2080000 0.05458533 0.2627001 1.009195
Loops implícitos
editarA função apply (e suas variantes) é uma forma de usar loops de forma eficiente. Seu uso será visto mais tarde.
Funções
editarUma função é tratada como uma variável, cuja declaração começa por
function(argumentos) { # corpo da funcao }
Acima, temos uma função anônima. Para dar um nome, basta determinar que uma variável é igual a ela:
> fn <- function(){ + print("hello") + } > fn() [1] "hello"
Tempo de processamento
editarEm programas que consomem muito tempo, é importante descobrir quais partes do código estão pesando.
As funções system.time() e proc.time() servem para isto.
system.time() retorna o tempo de CPU (CPU time)
> system.time(x<-rnorm(10^6)) [1] 1.14 0.07 1.83 0.00 0.00
> debut <- proc.time() > x <- rnorm(10^6) > proc.time()-debut [1] 1.66 0.10 10.32 0.00 0.00
Funções semelhantes ao Unix
editar- system() permite executar funções do sistema operacional (DOS, unix, etc). Por exemplo, se existe uma função no sistema operacional para converter entre padrões de imagem, convert, que converte de .ps para .png, pode-se chamá-la:
system("convert W:/toto.ps W:/toto.png")
- file.info() dá informações sobre um arquivo.
> file.info("taille.txt") size isdir mode mtime ctime atime exe taille.txt 444 FALSE 666 2009-06-26 12:25:44 2009-06-26 12:25:43 2009-06-26 12:25:43 no
Podem-se apagar arquivos com file.remove():
file.remove(dir(path="directoryname", pattern="*.log"))