В настоящее время я изучаю возможности R's Reference Class, и я пытаюсь склонить голову к настраиваемым функциям доступа. Ручные состояния для поля, что:Определение функции доступа для ссылочного класса
элемент в списке может быть альтернативно функцией аксессор, функция одного аргумента, который возвращает поле, если вызывается без аргумента или устанавливает его в значение в противном случае. Функции Accessor используются внутри и для межсистемного интерфейса приложений. Их определение следует правилам для методов записи для класса: они могут ссылаться на другие поля и могут вызывать другие методы для этого класса или его суперклассов. См. Раздел «Внедрение» для внутреннего механизма, используемого функциями доступа .
Все, что я смог найти, это использовать функции доступа в контексте file storage. Привыкнув к частным внутренним переменным и входных валидаций я бы сказал, что это где проверки входных данных должны быть, см пример ниже:
Account <-
setRefClass("Account",
fields = list(data = "list",
balance =
function(value){
if (missing(value)){
return(data$balance)
}else{
if (!is.numeric(value))
stop("You can only set the balance to a numeric value!")
data$balance <<- value
}
}),
methods = list(
withdraw = function(x) {
balance <<- balance - x
},
deposit = function(x) {
balance <<- balance + x
}
))
Это работает, как ожидалось:
> a <- Account$new(balance = 0)
>
> a$deposit(10)
> a$balance
[1] 10
>
> a$withdraw(1)
> a$balance
[1] 9
>
> a$balance <- "a"
Error in (function (value) :
You can only set the balance to a numeric value!
Что я хотел бы знать, есть ли причина для этого, поскольку это кажется естественным подходом, но не упомянутым в руководстве? Есть ли хороший способ полностью скрывать переменную данных, например. используя .self <- local({data = list(); .self})
в некоторый момент.
Я видел сообщение, я считаю, что существует путь, который в пределах R заставляет переменные вести себя в частной манере. @hadley предлагает в своей превосходной книге Advanced R в [упражнении] (http://adv-r.had.co.nz/OO-essentials.html): * Используйте полевую функцию, чтобы предотвратить баланс аккаунта непосредственно манипулировать *. Он предлагает использовать поле «.balance» и функцию поля баланса, но на самом деле не скрывает это поле. Я попытался использовать 'balance = local ({balance <- NULL; my_func() ...})', но это эквивалентно [статической переменной] (http://en.wikipedia.org/wiki/Static_variable) , –