Curso
Programação orientada a objetos (POO) é um paradigma de programação em que diferentes métodos são usados para projetar software em torno de dados ou objetos, em vez de apenas funções. Um método nada mais é do que uma função, falada no contexto de POO. Ela é orientada a objetos porque todo o processamento gira em torno dos objetos e de seus campos. Cada objeto tem atributos e comportamentos próprios.
Na programação orientada a objetos, todo o programa pode ser dividido em diferentes classes para facilitar o entendimento da execução. R é uma linguagem funcional, e a POO ajuda a gerenciar problemas de sistemas grandes. POO costuma ser usada para gerenciar aplicações com GUI, principalmente aplicações web. Programação orientada a objetos é ótima para construir ferramentas para análise de dados, mas não tão boa para a análise em si.
Sistemas de POO
Existem dois sistemas principais de POO no R, descritos abaixo:
- Classes S3: permitem sobrecarregar funções.
- Classes S4: permitem restringir os dados, sendo úteis quando é mais difícil depurar o programa.
Observação: essas classes serão detalhadas na próxima seção.
Objetos no R
Objetos são instâncias de classes. Aliás, tudo em R é um objeto; para saber mais, veja tipos de dados em R. Eles também podem ter atributos, como class, attributes, dimnames, names etc.
Por exemplo, objetos recebem um valor usando <-, considere o trecho a seguir, em que 'a1' e 'a2' são variáveis que recebem valores numéricos.
a1 <- 10
a2 <- 20
Um objeto pode receber um conjunto de números, como em 'a3', que contém um vetor com diferentes números.
a3 <- c(10,20,30)
Aqui, c reúne os números 10, 20 e 30 em um vetor.
Vamos a um exemplo do dia a dia: um aluno, com atributos nome, idade, série e gênero; e um professor, com nome, idade e gênero.
st_name <- "andrew"
st_age <- 16
st_class <- 10
st_gender <- "male"
t_name <- "angelina"
t_age <- 26
t_gender <- "female"
student <- c(st_name, st_age, st_class, st_gender)
teacher <- c(t_name, t_age, t_gender)
print(student)
print(teacher)
[1] "andrew" "16" "10" "male"
[1] "angelina" "26" "female"
O código acima gera a seguinte saída:
"andrew" "16" "10" "male"
"angelina" "26" "female"
No exemplo, você vê diferentes tipos de objetos. Os objetos 'student' e 'teacher', também chamados de variáveis, contêm valores dos tipos 'character' e 'double'.
Domine suas habilidades em dados com o DataCamp
Mais de 10 milhões de pessoas aprendem Python, R, SQL e outras habilidades tecnológicas usando nossos cursos práticos elaborados por especialistas do setor.

Classe em R
Classe é o blueprint que ajuda a criar um objeto e define suas variáveis-membro e atributos.
Como vimos antes, há duas classes de POO em R: S3 e S4.
Classe S3
Essas classes permitem sobrecarregar funções dividindo-as em genéricas e métodos.
funções = genéricas + métodos
S3 é bem diferente de linguagens como C#, Java etc. Por ser muito simples de implementar, usa apenas o primeiro argumento para o despacho. Por isso, não exige tanto conhecimento do ponto de vista do programador.
S3 funciona definindo uma convenção rígida de nomes no formato generico.ponto.classe.
generic.class
Os argumentos dos métodos devem incluir os argumentos da genérica, e o método deve incluir ...arg.
Construindo uma classe S3 (com exemplo)
No exemplo a seguir, vamos construir uma classe S3 criando uma lista cujos componentes são passados com um nome de classe apropriado e, em seguida, imprimindo o resultado.
No exemplo, 'studentBio' é uma lista com os componentes 'student_name', 'student_age' e 'student_contact'. A classe recebe o nome 'Student Info', e 'studentBio' é a nova classe criada, cujos valores são exibidos abaixo.
studentBio <- list(studentName = "Harry Potter", studentAge = 19, studentContact="London")
class(studentBio) <- "StudentInfo"
studentBio
$studentName
[1] "Harry Potter"
$studentAge
[1] 19
$studentContact
[1] "London"
attr(,"class")
[1] "StudentInfo"
O código acima gera a saída a seguir:
$studentName
"Harry Potter"
$studentAge
19
$studentContact
"London"
attr(,"class")
"StudentInfo"
Se você não está tão à vontade escrevendo funções em R, confira um tutorial sobre como usar funções em R.
Criando sua própria função genérica em S3
Vamos implementar abaixo uma função genérica usando o código a seguir.
O código abaixo define a função genérica 'contact', que recebe um objeto. 'UseMethod' é usado com a genérica 'contact' para fazer o "despacho" do método, ou seja, escolher o resultado com base nos argumentos passados.
contact <- function(object) {
UseMethod("contact")
}
Vamos criar um método para a classe que você criou, chamada 'StudentInfo'. O método 'contact' seguido de ponto mais o nome da classe 'StudentInfo' é usado; no corpo da função, o atributo 'studentContact' é acessado com '$'.
contact.StudentInfo <- function(object) {
cat("Your contact is", object$studentContact, "\n")
}
contact(studentBio)
Your contact is London
No código acima, usamos object$studentContact, onde o objeto é passado como argumento para a função e '$' acessa o atributo 'studentContact', resultando na saída abaixo.
Your contact is London
Classe S4
A classe S4 é mais rígida, convencional e próxima dos conceitos de POO. As classes são representadas por definições formais em S4. Mais especificamente, S4 possui funções setter e getter para métodos e genéricas. Em comparação com S3, S4 permite múltiplos despachos.
Vamos ver na prática as classes discutidas, criando-as e explorando um exemplo.
Uma classe S4 é definida usando a função setClass.
setClass()
Construindo uma classe S4 (com exemplo)
Como mencionado, a classe S4 é definida com setClass(). Vamos usar setClass() para criar e definir a classe S4. Também usaremos uma sub-rotina para verificar a consistência dos dados (validação) e definir valores padrão (o paradigma).
Veja o código para definir a classe e seus slots:
No exemplo a seguir, definimos uma classe (também chamada de 'prototype'), na qual os slots são definidos: o nome da classe é 'employee', name é character, id é numeric e contact é character.
setClass("employee", slots=list(name="character", id="numeric", contact="character"))
O código abaixo cria instâncias específicas (objetos) de S4.
Vamos criar um objeto usando 'new' com o nome da classe 'employee' e preencher os slots name, id e contact com valores.
obj <- new("employee",name="Steven", id=1002, contact="West Avenue")
obj
An object of class "employee"
Slot "name":
[1] "Steven"
Slot "id":
[1] 1002
Slot "contact":
[1] "West Avenue"
An object of class "employee"
Slot "name":
"Steven"
Slot "id":
1002
Slot "contact":
"West Avenue"
A saída mostra que o objeto criado é da classe "employee" e que o Slot "name" tem "Steven", o Slot "id" tem valor 1002 e o Slot "contact" tem o valor "West Avenue".
Funções e comandos
Para verificar se um objeto é S4 ou não, você pode usar dois comandos:
O comando 'is.object(obj)' verifica se uma variável ou instância se refere a um objeto.
is.object(obj)
TRUE
O código acima gera a seguinte saída:
TRUE
O comando 'is.S4(obj)' verifica se uma variável ou instância é um objeto S4.
isS4(obj)
TRUE
O código acima gera a seguinte saída:
TRUE
Acessando e modificando o valor de um slot
Acessando o slot
O slot pode ser acessado usando "@" em vez de "$".
Use 'obj@name' para acessar o nome 'Steven' e, de forma semelhante, 'obj@id'.
obj@name
obj@id
'Steven'
1002
O código acima retorna:
'Steven'
1002
Modificando o slot
Vamos modificar o valor do slot usando o operador de atribuição ("<-") para definir 'obj@contact' com um novo valor: "North Avenue".
obj@contact <- "North Avenue"
obj
An object of class "employee"
Slot "name":
[1] "Steven"
Slot "id":
[1] 1002
Slot "contact":
[1] "North Avenue"
O código acima retorna:
An object of class "employee"
Slot "name":
"Steven"
Slot "id":
1002
Slot "contact":
"North Avenue"
A saída mostra que o Slot "contact" mudou seu valor de "West Avenue" para "North Avenue".
Como alternativa, você pode usar 'slot()' para alterar o valor.
'slot(obj, "id")' indica o slot "id", que será alterado para 1004; em seguida, imprimimos 'obj'.
slot(obj,"id") <- 1004
obj
An object of class "employee"
Slot "name":
[1] "Steven"
Slot "id":
[1] 1004
Slot "contact":
[1] "North Avenue"
An object of class "employee"
Slot "name":
"Steven"
Slot "id":
1004
Slot "contact":
"North Avenue"
A saída mostra que o Slot "id" mudou seu valor de 1002 para 1004.
Criando sua própria função genérica em S4
Vamos criar uma função que imprime a saída do jeito que precisamos, usando 'setMethod()' com a função genérica 'show()'. Todos os valores dos slots são acessados por '@' e seus nomes são impressos. Por fim, obtemos a saída com 'obj'.
setMethod("show",
"employee",
function(object) {
cat("Name:",object@name, "\n")
cat("Id:",object@id, "\n")
cat("Contact:", object@contact, "\n")
}
)
obj
Name: Steven
Id: 1004
Contact: North Avenue
Name: Steven
Id: 1004
Contact: North Avenue
A saída mostra os nomes dos Slots acompanhados de seus respectivos valores.
Parabéns
Parabéns, você chegou ao fim deste tutorial!
Neste tutorial, você aprendeu sobre programação orientada a objetos (POO) no R, seus objetos, as classes S3 e S4, como construí-las, como criar funções genéricas com exemplos e muito mais.
Se quiser aprender mais sobre R, confira os cursos da DataCamp:

