Общественные и частные слоты в R?

При определении классов R имеет какое-либо понятие частных или открытых слотов?

Если в языке нет строгой функции, существует ли общая схема именования?

Ответ 1

ИЗМЕНИТЬ:

Чтобы дать немного истории: в функции setClass был предоставлен вариант "доступ" для создания так называемых "привилегированных слотов", к которым можно было получить доступ только через геттеры и сеттеры, предоставляемые классом. Это позволило бы создавать частные слоты (не предоставляя геттер), но эта функция никогда не была реализована. Страница справки ?setClass в настоящее время читает:

доступ и версия, включенная для совместимости с S-Plus, но в настоящее время игнорируется.


Таким образом, нет таких вещей, как частные и общедоступные слоты, так как через обозначение @ каждый слот доступен. И лично я очень доволен этим, так как он позволяет мне использовать информацию из объектов, которые труднодоступны, используя геттеры и сеттеры, включенные в пакет. Это также позволяет мне экономить тяжелые расчеты, избегая накладных расходов, создаваемых геттерами и сеттерами.

Мне не известно ни одного соглашения об именах для проведения различия между общедоступными и "private" слотами. Вы можете сделать различие для себя, предшествовав слову "private" точкой, но это не влияет на поведение этих слотов. Это также не обычная практика, так как большинство программистов R не заботятся о публичных и частных слотах. Они просто не предоставляют геттеры и сеттеры для слотов, которые средний пользователь не должен достичь.

Чтобы дать тривиальный пример: следующее создает класс с двумя слотами, а также геттер и сеттер только для одного слота.

setClass("Example",
  representation(
    aslot = "numeric",
    .ahiddenslot = "character"
  )
)

setGeneric("aslot", function(x) standardGeneric("aslot"))

setMethod("aslot","Example",function(x){
    [email protected]
})

setGeneric("aslot<-", function(x,value) standardGeneric("aslot<-"))

setMethod("aslot<-","Example",function(x,value){
    [email protected] <- value
    x
})

Вы также можете установить метод show, который просто не распечатывает скрытый слот:

setMethod("show","Example",function(object){
  cat("Example with value for aslot: ", [email protected],"\n")
})

Это дает следующее нормальное использование:

> X <- new("Example",aslot=1,.ahiddenslot="b")
> X
Example with value for aslot:  1 
> aslot(X)
[1] 1
> aslot(X) <- 3

Но хадиднслот по-прежнему доступен:

> slot(X,".ahiddenslot")
[1] "b"