Janko Thyson
2011-May-26 17:12 UTC
[Rd] Reference Classes: getter and setter functions/methods and possible shortcuts
Hi everyone, just wanted to ask what's the smartest/recommended way of defining getter and setter function *shortcuts* (i.e. something like "[", "[<-") for Reference Class objects? Or is it desired to not use this stuff, but define methods like 'obj$getSubset(row=1:3, col=1)' and 'obj$setSubset(value=x)' instead? I have some example code that might help in clarifying what I'm exactly after: setRefClass( Class="MyDataFrame", fields=list( PRIMARYDATA="data.frame" ), methods=list( "subsetGet"=function( idx.row, idx.col, drop=if(missing(idx.row)) TRUE else length(PRIMARYDATA) == 1, ... ){ PRIMARYDATA[idx.row, idx.col, drop=drop] } ) ) setMethod( f="initialize", signature=signature(.Object="MyDataFrame"), definition=function( .Object, ..., row.names=NULL, check.rows=FALSE, check.names=TRUE, stringsAsFactors=default.stringsAsFactors() ){ x.primarydata <- data.frame(..., row.names=row.names, check.rows=check.rows, check.names=check.names, stringsAsFactors=stringsAsFactors) x.generator <- getRefClass(class(.Object)) x.generator$accessors(names(x.generator$fields())) .Object$PRIMARYDATA <- x.primarydata return(.Object) } ) myDataFrameCreate <- function( ..., row.names=NULL, check.rows=FALSE, check.names=TRUE, stringsAsFactors=default.stringsAsFactors(), .class.name="MyDataFrame" ){ out <- getRefClass(.class.name)$new( ..., row.names=row.names, check.rows=check.rows, check.names=check.names, stringsAsFactors=stringsAsFactors ) return(out) } "[.MyDataFrame" <- function( src, idx.row, idx.col, drop=if(missing(idx.row)) TRUE else length(src$PRIMARYDATA) == 1, ... ){ if(!inherits(src, "MyDataFrame")){ stop("Expecting 'src' to be of class 'MyDataFrame") } return(src$PRIMARYDATA[idx.row, idx.col, drop=drop]) } mdf <- myDataFrameCreate(a=1:5, b=1:5) mdf mdf$PRIMARYDATA mdf$getPRIMARYDATA() # automaticall set via 'getRefClass("MyDataFrame")$accessors()' mdf$subsetGet(1,1) mdf$subsetGet(1,) mdf$subsetGet(,1) mdf$subsetGet(,1,drop=FALSE) mdf[1,1] mdf[1,] mdf[,1] mdf[,1, drop=FALSE] Thanks a lot for any advice, Janko
Maybe Matching Threads
- Reference Classes/S4 Classes: can method dispatch check superclasses BEFORE resorting to method for "ANY"?
- Reference Classes: removing methods -> implications for objects/instances of that class
- Getter and Setter with non DB property
- Automatted Getter/Setter
- Reference classes: accessor functions via 'getRefClass(...)$accessors(...)'