Изменение поведения клонирования в классах R6 - PullRequest
0 голосов
/ 26 декабря 2018

Предположим, у меня есть класс R6, и один из его элементов - это внешний указатель, указывающий на некоторый объект C ++.

Итак, у меня есть что-то вроде этого:

myClass <- R6::R6Class(
  "myClass", 
  public = list(
    xp = NULL,
    initialize = function(x) {
      self$xp = cpp_fun_that_returns_a_pointer(x)
    }
  )
)

Если я использую myclass$clone() он все равно будет указывать на тот же myclass$xp.Это также произойдет, если я сделаю myclass$clone(deep = TRUE), так как он не знает, как клонировать на стороне C ++.

В этом случае я мог бы использовать собственный метод deep_clone ...

Но поскольку в моем случае использования всегда будет неправильно клонировать класс без глубокого клонирования это, мне интересно, можно ли напрямую изменить поведение clone.

Я пытался просто создать метод clone(), и это не разрешено R6.

Error in R6::R6Class("tensor", cloneable = FALSE, private = list(xp = NULL),  : 
  Cannot add a member with reserved name 'clone'.

1 Ответ

0 голосов
/ 06 февраля 2019

Вы можете определить пользовательский метод clone(), если используете cloneable = FALSE.Я не уверен, что все, что вы делаете с XPtr s, поэтому я продемонстрирую немного более простой пример:

# Set up the R6 class, making sure to set cloneable to FALSE
myClass <- R6::R6Class(
    "myClass", 
    public = list(
        xp = NULL,
        initialize = function(x = 1:3) {
            self$xp = x
        }
    ),
    cloneable = FALSE
)
# Set the clone method
myClass$set("public", "clone", function() {
    print("This is a custom clone method!") # Test print statement
    myClass$new(self$xp)
})
# Make a new myClass object
a <- myClass$new(x = 4:6)
# Examine it
a
#> <myClass>
#>   Public:
#>     clone: function () 
#>     initialize: function (x = 1:3) 
#>     xp: 4 5 6
# Clone it
b <- a$clone()
#> [1] "This is a custom clone method!"
# We see the test print statement was printed!
# Let's check out b:
b
#> <myClass>
#>   Public:
#>     clone: function () 
#>     initialize: function (x = 1:3) 
#>     xp: 4 5 6

Создано в 2019-02-05 представьте пакет (v0.2.1)

...