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.

Reply via email to