A maioria das informações relevantes pode ser encontrada olhando para , ?S3
ou ?UseMethod
em poucas palavras:
S3 refere-se a um esquema de envio de método. Se você já usou R por um tempo, você vai notar que existem print
, predict
e summary
métodos para uma série de diferentes tipos de objetos.
No S3, isso funciona por:
- definir a classe de objetos de interesse (por exemplo: o valor de retorno de uma chamada ao método
glm
possui classe glm
)
- proporcionando um método com o nome geral (por exemplo
print
), então um ponto, e depois o nome de classe (por exemplo:
print.glm
)
- alguma preparação deve ter sido feita para esse nome geral (
print
) para que isso funcione, mas se você está simplesmente procurando se adaptar aos nomes de métodos existentes, não precisa disso (consulte a ajuda a que me referi anteriormente, se precisar )
Para os olhos de quem vê e, principalmente, do usuário do seu novo pacote de encaixe de modelos, é muito mais conveniente digitar do predict(myfit, type="class")
que predict.mykindoffit(myfit, type="class")
.
Há um pouco mais, mas isso deve ajudá-lo a começar. Existem algumas desvantagens nessa maneira de despachar métodos com base em um atributo (classe) de objetos (e os puristas C provavelmente ficam acordados à noite, horrorizados com isso), mas, em muitas situações, funciona decentemente. Com a versão atual do R, novas formas foram implementadas (S4 e classes de referência), mas a maioria das pessoas ainda (apenas) usa o S3.
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. Tentemethods("mean")
listar os métodos genéricos com o nome da funçãomean
. 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
Os sistemas de objetos R
S3
S4
RC aka "Classes de referência"
R6
library(R6)
)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)Outras
Existem outros, como R.oo (semelhante ao RC), proto (baseado em protótipo, pense em JavaScript) e Mutatr . No entanto, "Advanced R" diz:
Leia também o capítulo sobre trade-offs em "Advanced R, 2nd edition" .
fonte