Got it. Thank you for the explanation. And thanks to everyone for their help.
On Wed, Jul 10, 2013 at 5:09 PM, William Dunlap <wdun...@tibco.com> wrote: > If you define a function 'foo<-' to replace a part of an object you need > to have a corresponding function 'foo' that extracts that same part. > If 'foo' does not exist or if 'foo' extracts something other than what > 'foo<-' > alters, then nested replacements will not work. > > The expression > bar(foo(x)) <- newValue > is evaluated as > tmp <- foo(x) # extract the part of x you want to alter > bar(tmp) <- newValue # alter the extracted stuff > foo(x) <- tmp # put the altered extracted stuff back where it came from > # tmp is then discarded > ('tmp' is chosen to be a name like '*tmp*'; you will see that in the > traceback > after an error.) > > Sometimes the 'extracted part' is not really a part of an object but > something > more abstract, but the it is still true that foo<- and foo need to be > paired. E.g., > > twoTimes <- function(x) { > + cat("Calling twoTimes: x=", deparse(x), "\n") > + x * 2 > + } > > `twoTimes<-` <- function(x, value) { > + cat("Calling twoTimes<-: x=", deparse(x), "\n") > + x[] <- value/2 > + x > + } > > p <- 1:5 > > twoTimes(p) > Calling twoTimes: x= 1:5 > [1] 2 4 6 8 10 > > twoTimes(p)[1:2] <- c(100,102) > Calling twoTimes: x= 1:5 > Calling twoTimes<-: x= 1:5 > > p > [1] 50 51 3 4 5 > > > > p <- 1:5 > > twoTimes(p[1:2]) <- c(100,102) > Calling twoTimes<-: x= 1:2 > > p > [1] 50 51 3 4 5 > > > Bill Dunlap > Spotfire, TIBCO Software > wdunlap tibco.com > > > > -----Original Message----- > > From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] > On Behalf > > Of Harry Mamaysky > > Sent: Wednesday, July 10, 2013 1:23 PM > > To: Bert Gunter > > Cc: r-help@r-project.org > > Subject: Re: [R] replacement functions for subsets > > > > So how would I get the following to work? > > > > > aa<-1 > > > aa > > [1] 1 > > > 'foo<-' <- function(x,value) x<-value > > > foo(aa)<-1:10 > > > aa > > [1] 1 2 3 4 5 6 7 8 9 10 > > > # This doesn't work: > > > foo(aa)[4:5] <- c(101,102) > > Error in foo(aa)[4:5] <- c(101, 102) : could not find function "foo" > > > # What I would like to see is: aa becomes 1 2 3 101 102 6 7 8 9 10 > > > # Is it possible to define such a function 'foo'? > > > > > > Sent from my iPhone > > > > On Jul 10, 2013, at 4:10 PM, Bert Gunter <gunter.ber...@gene.com> wrote: > > > > I think the OP may perhaps want to define a method for "[<-" . > > > > e.g. try: > > > > methods("[<-") > > > > If this is not it ... ?? > > > > Cheers, > > Bert > > > > On Wed, Jul 10, 2013 at 12:51 PM, David Winsemius > > <dwinsem...@comcast.net> wrote: > > > > > > On Jul 10, 2013, at 12:17 PM, Harry Mamaysky wrote: > > > > > >> As I understand it rownames(aa) returns a copy of an attribute of aa. > So changing the > > value of this vector should make the change to the copy of the row.names > attribute. I > > would then have to set the original row.names equal to this copy to > effect the change. > > >> > > >> So my question is why "rownames(aa)[2:4] <-" changes the original > attribute rather > > than its copy? > > > > > > I'm not sure how you decide that was happening. Your first paragraph > seemed correct: > > > > > > aa <- data.frame( a=1:10,b=101:110 ) > > > str(aa) > > > attributes(aa) > > > dput(aa) > > > `rownames<-` > > > > > >> trace(`rownames<-`) > > >> rownames(aa)[2:4] <- c('row2','row3','row4') > > > trace: `rownames<-`(`*tmp*`, value = c("1", "row2", "row3", "row4", > > > "5", "6", "7", "8", "9", "10")) > > > > > > You can see that R first builds a full length vector with the second > argumens to > > `rownames<-` fully expanded before doing the assignment to the > 'row.names' attribute. > > > > > >> > > >> And the follow on question is whether it's possible to have > "f(x)[2:4] <-" operate in the > > same way for some user defined replacement function f. > > > > > > Take a look at the code: > > > > > > `row.names<-.data.frame` > > > > > > -- > > > David. > > >> > > >> Sent from my iPhone > > >> > > >> On Jul 10, 2013, at 3:05 PM, David Winsemius <dwinsem...@comcast.net> > wrote: > > >> > > >> > > >> On Jul 10, 2013, at 11:47 AM, Harry Mamaysky wrote: > > >> > > >>> I know how to define replacement functions in R (i.e. foo<- <- > function(x,value) x<- > > value, etc.), but how do you define replacement functions that operate > on subsets of > > arrays (i.e. how do you pass an index into foo)? > > >>> For example, why does the following use of rownames work? > > >> > > >> `rownames` of a dataframe is a vector, so indexing with "[" and a > single vector of > > indices is adequate. I cannot really tell what your conceptual > "why"-difficulty might be. > > This is just assignment within a vector. That is not really a > "replacement function > > operating on a subset of an array" since rownames are not values of the > dataframe .... > > and it's not an "array". (Careful use of terms is needed here.) > > >> > > >> > > >>> > > >>>> aa <- data.frame( a=1:10,b=101:110 ) > > >>> > > >>>> aa > > >>> > > >>> a b > > >>> > > >>> 1 1 101 > > >>> > > >>> 2 2 102 > > >>> > > >>> 3 3 103 > > >>> > > >>> 4 4 104 > > >>> > > >>> 5 5 105 > > >>> > > >>> 6 6 106 > > >>> > > >>> 7 7 107 > > >>> > > >>> 8 8 108 > > >>> > > >>> 9 9 109 > > >>> > > >>> 10 10 110 > > >>> > > >>>> rownames(aa)[2:4] <- c('row2','row3','row4') > > >>> > > >>>> aa > > >>> > > >>> a b > > >>> > > >>> 1 1 101 > > >>> > > >>> row2 2 102 > > >>> > > >>> row3 3 103 > > >>> > > >>> row4 4 104 > > >>> > > >>> 5 5 105 > > >>> > > >>> 6 6 106 > > >>> > > >>> 7 7 107 > > >>> > > >>> 8 8 108 > > >>> > > >>> 9 9 109 > > >>> > > >>> 10 10 110 > > >>> > > >>> > > >>> > > >>> > > >>> Thanks, > > >>> > > >>> Harry > > >>> > > >>> > > >>> [[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. > > >> > > >> David Winsemius > > >> Alameda, CA, USA > > > > > > David Winsemius > > > Alameda, CA, USA > > > > > > ______________________________________________ > > > 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. > > > > > > > > -- > > > > Bert Gunter > > Genentech Nonclinical Biostatistics > > > > Internal Contact Info: > > Phone: 467-7374 > > Website: > > http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb- > > biostatistics/pdb-ncb-home.htm > > > > [[alternative HTML version deleted]] > > [[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.