Comece agoraComece grátis

Eletricidade estática

Classes R6 podem usar o comportamento de cópia por referência de ambientes para compartilhar campos entre objetos. Para configurar isso, defina um campo privado chamado shared. Esse campo leva várias linhas para ser definido. Ele deve:

  • Criar um novo ambiente.
  • Atribuir quaisquer campos compartilhados a esse ambiente.
  • Retornar o ambiente.

Os campos compartilhados devem ser acessados por meio de active bindings. Elas funcionam da mesma forma que outras active bindings que você já viu, mas recuperam os campos usando o prefixo private$shared$.

R6Class(
  "Thing",
  private = list(
    shared = {
      e <- new.env()
      e$a_shared_field <- 123
      e
    }
  ),
  active = list(
    a_shared_field = function(value) {
      if(missing(value)) {
        private$shared$a_shared_field
      } else {
        private$shared$a_shared_field <- value
      }
    }
  )
)

Observe que o nome da active binding deve ser o mesmo nome do campo compartilhado que você deseja obter ou definir; ambos são a_shared_field no exemplo acima.

Este exercicio faz parte do curso

Programação Orientada a Objetos com S3 e R6 em R

Ver curso

Instruções do exercicio

Uma classe MicrowaveOven foi parcialmente definida para você.

  • No elemento private da classe MicrowaveOven, atualize o campo chamado shared.
    • Esse campo deve conter três linhas de código entre chaves, {}.
    • Primeiro, ele deve chamar new.env() (docs) para criar um novo ambiente chamado e, depois …
    • Atribuir uma variável em e chamada safety_warning, que recebe o valor "Warning. Do not try to cook metal objects.", depois …
    • Retornar o ambiente.
  • Adicione uma active binding chamada safety_warning que obtenha ou defina o campo privado compartilhado safety_warning.
    • Defina isso como uma função dentro do elemento active.
    • Ela recebe um único argumento chamado value.
    • Ela deve obter ou definir private$shared$safety_warning.
  • Crie dois objetos MicrowaveOven, chamados a_microwave_oven e another_microwave_oven, respectivamente.
  • Altere o campo safety_warning em a_microwave_oven para "Warning. If the food is too hot you may scald yourself.".
  • Olhe o campo safety_warning em another_microwave_oven para garantir que ele foi alterado.

exercicio interativo prático

Tente este exercicio completando este código de exemplo.

# Complete the class definition
microwave_oven_factory <- R6Class(
  "MicrowaveOven",
  private = list(
    shared = {
      # Create a new environment named e
      ___
      # Assign safety_warning into e
      ___
      # Return e
      ___
    }
  ),
  active = list(
    # Add the safety_warning binding
    safety_warning = ___(___) {
      if(___(___)) {
        ___
      } else {
        ___ <- ___
      }
    }
  )
)

# Create two microwave ovens
a_microwave_oven <- ___
another_microwave_oven <- ___
  
# Change the safety warning for a_microwave_oven
___ <- "Warning. If the food is too hot you may scald yourself."
  
# Verify that the warning has change for another_microwave
___ 
Editar e Executar Código