The following code gives you functionality close to what you are looking for (I think)... but someone more familar with proto might be able to make it sexier. You will need to install the package 'proto' (though with a bit of work you might be able to do this without proto, using environments alone.
library(proto) my.mat <- function(mat) { structure(proto( expr = { mat <- mat set.vals <- function(., rs, cs, vals) { if(max(rs) > nrow(.$mat) || min(rs) < 1) stop("row out of range") if(max(cs) > ncol(.$mat) || min(cs) < 1) stop("column out of range") .$mat[rs, cs] <- vals } get.mat.ref <- function(., rows, cols) { if(max(rows) > nrow(.$mat) || min(rows) < 1) stop("row out of range") if(max(cols) > ncol(.$mat) || min(cols) < 1) stop("column out of range") tmp <- proto(., expr = { set.vals <- function(., rs, cs, vals) { if(max(rs) > length(.$rows) || min(rs) < 1) stop("row out of range") if(max(cs) > length(.$cols) || min(cs) < 1) stop("column out of range") .super$mat[.$rows[rs], .$cols[cs]] <- vals } }) tmp$rows <- rows tmp$cols <- cols structure(tmp, class=c('my.sub.mat', 'proto', 'environment')) } }), class=c('my.mat', 'proto', 'environment')) } "[.my.mat" <- function(x, ...) get('mat', x)[...] "[<-.my.sub.mat" <- "[<-.my.mat" <- function(x, i, j, value) {x$set.vals(i, j, value); as.proto(x)} print.my.sub.mat <- function(x) print(get('mat',x)[get('rows', x), get('cols', x)]) print.my.mat <- function(x) print(get('mat',x)) #You can use this code like: a <- my.mat(matrix(1:(4*3),4,3)) b <- a$get.mat.ref(2:3, 2:3) b[1,1] <- 42 # equivalent to b$set.vals(1,1,42) b[1:2,2] <- 43 a[1,1] <- 44 a[rep(4, 2), 2:3] <- 45 b # print the sub matrix a # print the matrix #test passing sub-matrix to a function test <- function(x) x[2,1] <- 46 test(b) a # print the matrix again (it is as we would like) # extract the original matrix dat <- a$mat Hope this helps, Simon Knapp On Mon, Jan 18, 2010 at 12:36 PM, Friedrich <goti...@gmail.com> wrote: > Hello, > > I'm am in the process of trying to port a RATS functions to R and have > the problem, that RATS allows for the creation of submatrixes that are > linked to their basematrix. > > Basically it should work like this: > > a = matrix(1:(4*3),4,3) > a > # [,1] [,2] [,3] > # [1,] 1 5 9 > # [2,] 2 6 10 > # [3,] 3 7 11 > # [4,] 4 8 12 > > # This of course doesnt work :) > b = submatrix(a,fromx=1,tox=2,fromy=1,toy=2) > b > # [,1] [,2] > # [1,] 0 10 > # [2,] 7 11 > b[1,1] = 42 > a[1,1] > # [1] 42 > > so changes in the sub-matrix propagate to the "base" matrix. > > Does such a feature exist? > > Thanks, > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. > [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.