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

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to