2015-10-11 169 views
3

我很好奇,如果有一種方法可以在類的定義內爲R6類創建類變量嗎?我讀了Introduction to R6 classes小插曲,但沒有發現類變量的任何提及。我可以在使用ClassName$variableName <- initial_value創建類後創建類變量,但對於在實際的類定義中是否有辦法執行此操作很好奇。R6類變量

作爲一個例子,考慮下面的Person類,其中有一類變量count這使已被實例化Person對象的數量的軌道:

library(R6) 

Person <- R6Class("Person", 
    public = list(
    name = NA, 

    initialize = function(name) { 
     Person$count <- Person$count + 1 
     if (!missing(name)) self$name <- name 
    } 
) 
) 

Person$count <- 0 

Person$count # 0 
john <- Person$new("John") 
Person$count # 1 
james <- Person$new("James") 
Person$count # 2 

回答

2

你問的不完全的東西,但這可能有幫助。您可以向該類添加環境以存儲在類的所有實例之間共享的變量。由於環境的引用語義,只要創建了新的實例Person實例,就不會重置此環境。

下面是一個例子

library(R6) 

Person = R6Class(
    "Person", 
    public = list(
    name = NA, 
    initialize = function(name){ 
     if (!missing(name)) self$name <- name 
     counter = self$getCounter() 
     private$shared_env$counter = counter + 1 
    }, 
    getCounter = function(){ 
     counter = private$shared_env$counter 
     if(is.null(counter)) 
     counter = 0 
     return(counter) 
    } 
), 
    private = list(
    shared_env = new.env() 
) 
) 

測試代碼

john <- Person$new("John") 
john$getCounter() 
# 1 
james <- Person$new("James") 
james$getCounter() 
# 2 
john$getCounter() 
# 2 

可以將此方法與積極的綁定結合起來,使之類的東西john$counter等正常工作。如果要在銷燬對象時減少計數器,請使用R6中的finalize方法。