В R, как можно сделать метод объекта S4, который напрямую регулирует значения внутри слотов этого объекта?

StackOverflow https://stackoverflow.com/questions/3412942

  •  26-09-2019
  •  | 
  •  

Вопрос

Есть ли способ разрешить метод объекта S4 напрямую регулировать значения внутри слотов этого объекта, не копируя весь объект в память и при необходимости переписать его в родительскую среду в конце метода? Прямо сейчас у меня есть объект, имеющий слоты, где оно отслеживает свое собственное состояние. Я называю методом, который продвигает его к следующему состоянию, но сейчас кажется, что я должен назначить () каждое значение (или копию объекта, вызывающего метод) обратно в родительскую среду. В результате, ориентированный на объект код, похоже, работает много Медленнее, чем код, который просто настраивает различные переменные состояния в петле.

Это было полезно?

Решение

Я задал этот вопрос о R-списке и нашел работу, чтобы имитировать пропуск по ссылке, что-то в стиле:

eval(
  eval(
     substitute(
        expression(object@slot <<- value)
     ,env=parent.frame(1) )
  )
)

Далеко не самый чистый код вокруг скажу ...

Предложение, исходящее из списка R-HELP, использует среду для решения этих случаев. Редактировать: вставленный настроен код.

setClass("MyClass", representation(.cache='environment',masterlist="list"))

setMethod("initialize", "MyClass",
  function(.Object, .cache=new.env()) {
    .Object@masterlist <- list()
    callNextMethod(.Object, .cache=.cache)
  })

sv <- function(object,name,value) {} #store value

setMethod("sv",signature=c("MyClass","character","vector"),
  function(object, name, value) {
    object@.cache$masterlist[[name]] <- value
  })

rv <- function(object,name) {} #retrieve value

setMethod("rv",signature=c("MyClass","character"),
  function(object, name) {
    return(object@.cache$masterlist[[name]])
  })

Другие советы

R имеет три объектных ориентированных (OO) системы: S3, S4. а также Справочные классы (где последние были для некоторого, упомянуты как [[R5]], но их официальное название является ссылочным классами).

Ссылочные классы (или reflasses) являются новыми в R 2.12. Они наполняют долгую позицию для мусорных объектов, которые ранее были заполнены непростыми пакетами, такими как R.OO, прото и mutatr. Хотя основная функциональность является твердой, эталонные классы все еще являются активными разработками, а некоторые детали изменится. Наиболее современная документация для справочных классов всегда можно найти в? Рефератки.

Существует два основных различия между эталонными классами и S3 и S4:

  • Объекты reflass используют сообщение прохождение сообщения OO
  • Объекты Reflass Object являются Musable: обычная копия R на модифицировании семантики не применяется.

Эти свойства делают эту систему объекта, ведут себя намного больше похожи на Java и C #. Читайте больше здесь:

  1. http://adv-r.had.co.nz/r5.html.

  2. http://www.inside-r.org/r-doc/methods/referenceClasses.

Насколько я знаю (и если я вас правильно), вы должны вызвать весь объект. Вы не можете легко пройти значения по ссылке, он всегда передается «по значению». Поэтому, как только вы внесите модифицированную (копию) своего объекта, вам нужно вернуться к своему объекту.

Джон Палата довольно четко об этом в его книге Программное обеспечение для анализа данных. Отказ Это способ избежать сюрпризов или побочных эффектов.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top