Эта проблема беспокоила меня уже несколько месяцев. Сегодня я нашел очень удобное решение, вдохновленное https://stat.ethz.ch/pipermail/r-help/2012-January/299743.html
Давайте начнем с ReferenceClass, который имеет ошибочную реализацию:
MyClass <- setRefClass(
"MyClass",
fields = list(
xy = "data.frame"
),
methods = list(
initialize = function( df ){
if( !missing( df ) ){
xy <<- df
}
},
getSecondRow = function(){
# A mistake happend here
return( xy[1,] )
}
)
)
mc <- MyClass$new( data.frame( a = 1:10, b = rnorm(10) ) )
mc$getSecondRow()
a b
1 1 0.1349983
Реализация getSecondRow
, очевидно, не дает желаемого результата. Таким образом, фиксированный метод должен выглядеть как
getSecondRow = function(){
return( xy[2,] )
}
Классы без явной реализации конструктора
Хитрость вместо загрузки класса и воспроизведения объекта с нуля состоит в том, чтобы создать новый объект из существующего, используя функциональность конструктора копирования стандартного initialize( ... )
конструктора. После отладки и перезагрузки класса вы можете просто скопировать существующий объект с реализацией в ту же переменную с помощью
# NOTRUN
mc <- MyClass$new( mc )
Классы с перезаписанным конструктором.
Однако в представленном здесь случае стандартный конструктор уже перезаписан. Но в таких случаях вы можете просто использовать функциональность callSuper( ... )
, чтобы ваш конструктор выглядел как
initialize = function( df, ... ){
callSuper( ... )
if( !missing( df ) ){
xy <<- df
}
}
Наконец, ваш фиксированный объект получен из
mc <- MyClass$new( mc$xy, mc )
mc$getSecondRow()
a b
2 2 0.8452587