Aqui está um resumo rápido e atualizado dos inúmeros sistemas de objetos R de acordo com "Advanced R, 2nd edition" (CRC Press, 2019) de Hadley Wickham (cientista-chefe do RStudio), que possui uma representação na Web aqui , com base no capítulo sobre Objeto Programação orientada .
A primeira edição de 2015 tem uma representação na Web aqui , com o capítulo correspondente sobre OO aqui .
Abordagens para sistemas OO
Hadley define o seguinte para distinguir duas abordagens distintas da programação OO:
OOP funcional : métodos (partes de código que podem ser chamadas) pertencem a funções genéricas (não devem ser confundidas com métodos genéricos Java / C # ). Pense nos métodos como estando localizados em uma tabela de pesquisa global. O método a ser executado é encontrado pelo sistema de tempo de execução com base no nome da função e no tipo (ou classe de objeto) de um ou mais argumentos passados para essa função (isso é chamado de "despacho de método"). Sintaxe-wise, chamadas de método pode ser parecido com chamadas de funções comuns: myfunc(object, arg1, arg2)
. Essa chamada levaria o tempo de execução a procurar o método associado ao par ("myfunc", typeof (objeto)) ou possivelmente ("myfunc", typeof (objeto), typeof (arg1), typeof (arg2))se o idioma suportar isso. No S3 de R, o nome completo da função genérica fornece o par (nome da função, classe) . Por exemplo: mean.Date
é o método para calcular a média de datas. Tente methods("mean")
listar os métodos genéricos com o nome da função mean
. A abordagem OOP Funcional é encontrada, por exemplo, no pioneiro OO Smalltalk , no Common Lisp Object System e Julia . Hadley observa que "Em comparação com R, a implementação de Julia é totalmente desenvolvida e extremamente eficiente".
OOP encapsulado : os métodos pertencem a objetos ou classes e as chamadas de método geralmente se parecem object.method(arg1, arg2)
. Isso é chamado de encapsulado porque o objeto encapsula dados (campos) e comportamento (métodos). Pense no método como estando localizado em uma tabela de pesquisa anexada ao objeto ou à descrição da classe do objeto. O tempo de execução procura o método com base no nome do método e possivelmente no tipo de um ou mais argumentos. Essa é a abordagem encontrada em linguagens OO "populares", como C ++, Java, C #.
Nos dois casos, se a herança for suportada (provavelmente é), o tempo de execução poderá percorrer a hierarquia da classe para cima até encontrar uma correspondência para a chave de pesquisa de chamada.
Como descobrir a qual sistema um objeto R pertence
library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"
Os sistemas de objetos R
S3
- Abordagem funcional de POO.
- Sistema mais importante de acordo com Hadley.
- Mais simples, mais comum. Primeiro sistema OO usado por R.
- Vem com a base R, usada em toda a base R.
- Baseia-se em convenções e não em garantias impostas.
- Veja Chambers, John M e Trevor J. Hastie. 1992. "Modelos estatísticos em S." Wadsworth & Brooks / Cole Advanced Books & Software.
- Detalhes em "Advanced R, 2nd edition" aqui .
S4
- Abordagem funcional de POO.
- Terceiro sistema mais importante de acordo com Hadley.
- Reescreva o S3, portanto, semelhante ao S3, mas mais formal e mais rigoroso: obriga você a pensar cuidadosamente sobre o design do programa. Adequado para a construção de grandes sistemas (por exemplo, o projeto Bioconductor ).
- Implementado no pacote "métodos" base.
- Veja: Chambers, John M. 1998. "Programação com dados: um guia para a linguagem S." Springer.
- Detalhes em "Advanced R, 2nd edition" aqui .
RC aka "Classes de referência"
- Abordagem OOP encapsulada.
- Vem com a base R.
- Baseado em S4.
- Objetos RC são tipos especiais de objetos S4 que também são "mutáveis". ou seja, em vez de usar a semântica usual de copiar na modificação de R, eles podem ser modificados no local. Observe que é difícil argumentar sobre o estado mutável e uma fonte de erros feios, mas pode levar a um código mais eficiente em certos aplicativos.
R6
- Abordagem OOP encapsulada.
- Segundo sistema mais importante de acordo com Hadley.
- Pode ser encontrado no pacote R6 (instale com
library(R6)
)
- Semelhante ao RC, mas mais leve e muito mais rápido: não depende do S4 ou do pacote de métodos . Construído em cima de ambientes R. Também tem:
- métodos públicos e privados
- ligações ativas (campos que, quando acessados, na verdade chamam um método)
- herança de classe que funciona em pacotes
- ambos os métodos de classe (código que pertence a classe e pode acessar uma instância via
self
, private
, super
) e funções de membro (funções atribuídas aos campos, mas que não são métodos, apenas funções)
- Fornece uma maneira padronizada de escapar da semântica "copiar para modificar" de R
- Veja o site do pacote: "R6: Programação orientada a objetos encapsulada para R" .
- Detalhes em "Advanced R, 2nd edition" aqui .
Outras
Existem outros, como R.oo (semelhante ao RC), proto (baseado em protótipo, pense em JavaScript) e Mutatr . No entanto, "Advanced R" diz:
Além do R6, que é amplamente utilizado, esses sistemas são principalmente de interesse teórico. Eles têm seus pontos fortes, mas poucos usuários de R os conhecem e entendem, portanto é difícil para outros lerem e contribuírem para o seu código.
Leia também o capítulo sobre trade-offs em "Advanced R, 2nd edition" .