[R-br] Dúvida - Operadores %any%, :: e :::

Jose Claudio Faria joseclaudio.faria em gmail.com
Segunda Agosto 1 18:51:51 BRT 2011


Complementando as dicas do Benilton,

Em programação orientada a objetos (R é uma delas e usa atualmente
dois sistemas: S3 e S4)
algumas vezes o desenvolvedor opta por encapsular um objeto.

Encapsular um objeto (no caso uma função) significa ocultar do usuário
detalhes usados no desenvolvimento dessa função.

Por exemplo, as funções abaixo (plot.acf*, plot.data.frame*,
plot.factor*, plot.formula*, etc) estão todas encapsuladas.
Observe o marcador "*" em todas elas!

> methods(plot)
 [1] plot.acf*           plot.data.frame*    plot.decomposed.ts*
 [4] plot.default        plot.dendrogram*    plot.density
 [7] plot.ecdf           plot.factor*        plot.formula*
[10] plot.hclust*        plot.histogram*     plot.HoltWinters*
[13] plot.isoreg*        plot.lm             plot.medpolish*
[16] plot.mlm            plot.ppr*           plot.prcomp*
[19] plot.princomp*      plot.profile.nls*   plot.spec
[22] plot.spec.coherency plot.spec.phase     plot.stepfun
[25] plot.stl*           plot.table*         plot.ts
[28] plot.tskernel*      plot.TukeyHSD

   Non-visible functions are asterisked

Se você digita o nome de uma delas para ver seu código fonte:
> plot.data.frame

Recebe a mensagem: Erro: objeto 'plot.data.frame' não encontrado!
Ou seja, esta função está encapsulada (não visível ao usuário comum).

O operador ":::" lhe permite ter acesso ao código fonte de qualquer
função encapsulada (não visível):

> graphics:::plot.data.frame
function (x, ...)
{
    plot2 <- function(x, xlab = names(x)[1L], ylab = names(x)[2L],
        ...) plot(x[[1L]], x[[2L]], xlab = xlab, ylab = ylab,
        ...)
    if (!is.data.frame(x))
        stop("'plot.data.frame' applied to non data frame")
    if (ncol(x) == 1) {
        x1 <- x[[1L]]
        cl <- class(x1)
        if (cl %in% c("integer", "numeric"))
            stripchart(x1, ...)
        else plot(x1, ...)
    }
    else if (ncol(x) == 2) {
        plot2(x, ...)
    }
    else {
        pairs(data.matrix(x), ...)
    }
}
<environment: namespace:graphics>


Posso estar equivocado e gostaria de escutar a opinião da comunidade,
mas não vejo muito sentido em usar encapsulamento numa linguagem com
as características do R.

Abs,
-- 
///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
Jose Claudio Faria
Estatistica - Prof. Pleno
UESC/DCET/Brasil
joseclaudio.faria at gmail.com
///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\


Mais detalhes sobre a lista de discussão R-br