Aprendendo a usar o argumento '...' no R

A utilização do parâmetro '...' é algo que sempre me gera dúvidas, pois sempre me questiono por qual motivo ninguém nunca me falou sobre antes. Esta foi uma das minhas recentes descobertas no R e ajudou a entender muitas coisas que até então passavam despercebidas. Caso você seja um usuário recorrente da linguagem, bem provavelmente vai entender do que estou falando, afinal quem nunca topou com o argumento '...' ao ler o help de uma função qualquer? 

Acontece que ao criar uma função você pode definir um argumento que será passado como argumento para outra função a ser chamada. Por exemplo, vamos supor que você tenha uma função que pode fazer duas coisas: Se o número de observações for maior que 30, faz um histograma, caso contrário faz um boxplot. Então o código para esta função poderia ser o seguinte:


grafico<-function(x)
{
    if(length(x)<30)
    {
        boxplot(x)
    }
    else
    {
        hist(x)
    }

}

O problema é relativamente simples, e a função para resolvê-lo idem. Porém podem acontecer algumas complicações se fizermos uma nova proposta. Como sabemos, a função boxplot e hist possuem muitas opções de personalização (número de classes do histograma, se desejamos ou não plotar os outliers e por aí vai...). Então com base nesta nova proposta desejamos não apenas fazer o gráfico, mas também passar todas estas opções de personalização. Neste caso, uma opção seria inserir os novos parâmetros.

grafico<-function(x, bp.outliers=FALSE, hist.prob=TRUE )
{
    if(length(x)<30)
    {
        boxplot(x, outline=bp.outliers)
    }
    else
    {
        hist(x, probability=hist.prob)
    }

}

Feito isso, agora podemos não apenas fazer o gráfico, mas também definir alguns parâmetros. Vamos supor que não quiséssemos definir apenas um parâmetro das funções que fazem o gráfico, mas sim muitos. A coisa ficaria verdadeiramente confusa e trabalhosa, uma vez que deveríamos passar todos os parâmetros para a função gráfico, e posteriormente escrevê-los novamente nas funções que efetivamente o fazem. É exatamente nesta situação que o parâmetro '...' aparece.

grafico<-function(x, ... )
{
    if(length(x)<30)
    {
        boxplot(x, ...)
    }
    else
    {
        hist(x, ...)
    }

}

Com isso, não é mais necessário definir os parâmetros quando se escreve a função. A única necessidade é escrevê-los quando for chamar a função e isto melhora muito a compreensão do código. No caso anterior, a chamada da função gráfico seria a seguinte:

grafico(rnorm(100), outline=F, probability=F)

Bom, esta é uma técnica super simples que possui um custo quase nulo para ser implementada, e acreditem que isto é tudo que você precisa saber sobre o parâmetro '...' para utilizá-lo. Escrever a função principal torna-se mais simples e funcional, uma vez que economiza-se tempo escrevendo o código e você passa a se preocupar apenas com os reais parâmetros da função que está criando. O resto - que será utilizado por funções auxiliares - não importa muito, afinal tudo não passa de '...' .


2 comentários:

  1. Nunca comentei aqui, mas hoje senti a necessidade de fazer isso. Parabéns pela explicação bem detalhada. Mesmo sendo algo simples, que para quem está habituado com programação acaba passando despercebido, você conseguiu fazer uma explicação muito boa :)

    ResponderExcluir
    Respostas
    1. Olá Aishameriane. Agradecemos o elogio, é claro. E sinta-se a vontade para comentar e dar sugestões sempre que quiser, pois todos são bem-vindos.

      Excluir