Assim como outras linguagens de programação R oferece uma série de operadores para controle de fluxo de código.
Nota
Controles de fluxo são declarações usadas na linguagem, mas não são funções.
12.2 If
O controle if é a estrutura de controle mais básica que tomada de decisão e “direcionamento” de código. Em caso negativo do teste lógico nenhuma operação é executada.
x <-5# Códigos equivalentesif(x >4) print('x é maior do que quatro')
[1] "x é maior do que quatro"
if(x >4) { print('x é maior do que quatro')}
[1] "x é maior do que quatro"
if(x >4) {print('x é maior do que quatro') }
[1] "x é maior do que quatro"
if(x >4) { print('x é maior do que quatro')}
[1] "x é maior do que quatro"
if(x >4) {print('x é maior do que quatro')} # o mais organizado
[1] "x é maior do que quatro"
Note que se o teste não retornar TRUE ou FALSE o R reportará erro.
x <-NAif (x >4) print('x é maior do que quatro')
Error in if (x > 4) print("x é maior do que quatro"): valor ausente onde TRUE/FALSE necessário
12.3 Ifelse
R possui a funçãoifelse, que apesar de não ser para controle de fluxo, possui lógica de uso muito semelhante ao if e por este motivo será tratada neste capítulo. Esta função efetua teste em valor de entrada e define um valor a ser retornado caso verdadeiro e outro caso falso.
O retorno de ifelse possui o mesmo formato da estrutura informada no argumento test. Esta função pode ser usada para atribuição em data frames de forma mais sucinta.
O if else pode ser usado para inserir uma ação após o retorno negativo do teste feito pelo if.
x <-3if(x >4) {print('x é maior do que quatro')} else {print('x não é maior do que quatro')}
[1] "x não é maior do que quatro"
Veja que podem ser usadas muitas declaração else em sequência.
x <-3if(x >3) {print('x é maior do que três')} elseif (x <3){print('x é menor do que três')} elseif (x ==3){print('x é igual a três')}
[1] "x é igual a três"
12.5 Laço For
Um laço for é uma estrutura que efetua uma determinada quantidade de passos de acordo com a sequência informada. a declaração deve ser feita no formato: for(x in seq), sendo x a variável que será atualizada a cada iteração iniciando no ´rimeiro valor informado em seq e ecerrando no último. Um exemplo:
Caso se deseje mudar o incremento a cada passo pode ser usada a função seq. Também é possível usar um passo decrescente.
for(x inseq(2, 1, -0.25)) {print(paste('Valor de x:', x))}
[1] "Valor de x: 2"
[1] "Valor de x: 1.75"
[1] "Valor de x: 1.5"
[1] "Valor de x: 1.25"
[1] "Valor de x: 1"
No exemplo acima, x é inicializada com valor 1 e vai sendo incrementada em 1 unidade ao início do próximo passo. Um laço for também pode fazer iterações sobre vetores com texto, por exemplo.
for(i inc('São Paulo', 'Rio de Janeiro', 'Porto Alegre')){print(paste('Cidade atual:', i))}
[1] "Cidade atual: São Paulo"
[1] "Cidade atual: Rio de Janeiro"
[1] "Cidade atual: Porto Alegre"
No laço for a sequência no qual será feita a iteração é considerada antes de se iniciar o laço, assim mesmo se houver alguma alteração nesta sequência em um dos passos esta alteração não impactará na execução.
x <-3for(i in1:x) { x <- x +2print(x)}
[1] 5
[1] 7
[1] 9
12.6 While
For x While
Um laço for é utilizado quando se tem uma sequência definida de passos. Caso se deseje executar alguma operação até o atendimeto de uma condição, use while.
A estrutura while possui a seguinte configuração: while(condição). Assim, a repetição do código dentro de um bloco while ocorre até que a condição não seja mais satisfeita. Exemplo:
A variável condicao é iniciada com valor 5 e atende a condição se < 7. O código então é executado, imprimindo no console o valor da variavél e após esta recebe seu próprio valor mais 1. Na iteração seguinte seu valor é 6 e ainda atende a condição de se < 7. Na terceira iteração seu valor, novamente atualizado, será 7 e não cumprindo a condição o while é encerrado.
A estrutura while pode ficar operando indefinidamente se por algum motivo a condição seja sempre atendida. Teste o código abaixo e veja que ele rodará indefinidamente. Você pode pará-lo teclando ESC no teclado.
E estrutura repeat funciona de forma análoga ao while, entretanto esta não testa condição de parada. Para efetuar a parada o usuário deve fazer de forma explícita.
x <-1y <-2repeat{ x <- x + y print(x) if (x >11) break}
[1] 3
[1] 5
[1] 7
[1] 9
[1] 11
[1] 13
12.8 Break e Next
O break encerra as estruturas for, while e repeat. Next, por sua vez, interrompe a execução da iteração atual e inicia a próxima.
Abaixo um exemplo com uso de break em um laço for. Note que apenas a primeira iteração é executada.
for (i in1:3){print(i)break}
[1] 1
Abaixo um exemplo de uso do next. Repare que o comando print('Teste') nunca é executado, pois o next interrompe a execução da iteração atual, assim tudo que for colocado após esta linha (dentro do laço) não é executado.
for (i in1:3){print(i)nextprint('Teste')}
[1] 1
[1] 2
[1] 3
Em caso de laços embutidos, break e next impactam apenas o mais “interno”.
for (i in1:3){for (j in1:3){breakprint(paste('Valor de j é:', j)) }print(paste('Valor de i é:', i))}
[1] "Valor de i é: 1"
[1] "Valor de i é: 2"
[1] "Valor de i é: 3"
R Core Team. 2023. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.