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"
  • != 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) editar

Em 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 editar

A função apply (e suas variantes) é uma forma de usar loops de forma eficiente. Seu uso será visto mais tarde.

Funções editar

Uma 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 editar

Em 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")) 

Referências