5. library(R6)
Person <- R6Class("Person",
public = list(
name = NA,
hair = NA,
initialize = function(name, hair) {
if (!missing(name)) self$name <- name
if (!missing(hair)) self$hair <- hair
self$greet()
},
set_hair = function(val) {
self$hair <- val
},
greet = function() {
cat(paste0("Hello, my name is ", self$name, ".¥n"))
}
)
)
Person classを定義する
フィールド
メソッド
コンストラクタ
publicメンバは
selfを使って呼
び出す
HIRO: R Advent Calendar 2014
6. ann <- Person$new("Ann", "black")
> Hello, my name is Ann.
ann
> <Person>
> Public:
> greet: function
> hair: black
> initialize: function
> name: Ann
> set_hair: function
Person classのインスタンス化
ann$hair
> black
ann$set_hair <- “red”
#または
ann$hair <- “red”
ann$hair
> red
publicメンバへのアクセス
HIRO: R Advent Calendar 2014
7. Numbers <- R6Class("Numbers",
public = list(
x = 100
),
active = list(
x2 = function(value) {
if (missing(value)) return(self$x * 2)
else self$x <- value/2
},
rand = function() rnorm(1)
)
)
Number classの定義 publicメンバへのアクセス
n <- Numbers$new()
n$x
> [1] 100
n$rand
#> [1] 0.2648
n$rand
#> [1] 2.171
n$rand <- 3
#> Error: unused argument
(quote(3))
active bindingsへのアクセス
active bindings: アクセスされる
たびに実行される
HIRO: R Advent Calendar 2014
8. Queue <- R6Class("Queue",
public = list(
initialize = function(...) {
for (item in list(...)) {
self$push(item)
}
},
push = function(x) {
private$queue <- c(private$queue, list(x))
invisible(self)
},
pop = function() {
if (private$length() == 0) return(NULL)
# Can use private$queue for explicit access
head <- private$queue[[1]]
private$queue <- private$queue[-1]
head
}
),
private = list(
queue = list(),
length = function() base::length(private$queue)
)
)
今度の例はprivateメンバを含むクラス
push(“something”)の度にキューが伸びる
pop()で最初に入ったものから1つずつ取り
除かれる
HIRO: R Advent Calendar 2014