[Rd] bug or correct behaviour ?
Prof Brian Ripley
ripley at stats.ox.ac.uk
Fri Jun 11 20:01:26 CEST 2004
On Fri, 11 Jun 2004, Alex Nu wrote:
>
> Dr. Ripley,
>
> Thanks for your answer, I guest the key is that
> in my code R can't know tmp is being modified.
>
> I couldn't find a duplicate function for the
> R environment. Is there any ?
No. You should be doing this in your C/C++ code.
> So I could avoid doing tmp.last <-tmp*1.0
>
> Thanks
>
> Alex
>
>
>
> --- Prof Brian Ripley <ripley at stats.ox.ac.uk> wrote:
> > Without seeing your code for the .Call parts it is
> > impossible for us to
> > know, but as .Call does not duplicate its arguments
> > (unlike .C), it is
> > possible for it to change both tmp and a copy of
> > tmp, tmp.last.
> >
> > So it seems likely there is a bug in your C code if
> > that is not your
> > intention. The normal way to use .Call is to return
> > something, and to
> > duplicate any arguments which will be changed
> > (possibly only provided
> > NAMED(tmp) is true as otherwise there are no named
> > copies around).
> >
> > In other words, it would be normal to have
> >
> > tmp <- .Call("Replace", tmp, ...)
> >
> > and call duplicate() inside the C code for Replace.
> >
> > On Thu, 10 Jun 2004, Alex Nu wrote:
> >
> > >
> > > This is the general outline of my code::
> > >
> > > main(argc,argv){
> > > ...
> > > Rf_initEmbeddedR(argc,argv);
> > > ...
> > > Test_tryEval("source(test.r)");
> > > ...
> > > }
> >
> > Not sure of the relevance of this.
> >
> > > #############
> > > # test.r
> > > #############
> > > ...
> > > dyn.load("toload.so")
> > >
> > > tmp <-matrix(data=1,nrow=narray*2,ncol=nclust)
> > >
> > > .Call("Init",tmp,...)
> > > while(...) {
> > > criteria <-feval(tmp)
> > > if (criteria < criteria.min)
> > > tmp.last <- tmp
> >
> > That makes a potential copy. The actual copying
> > occurs if tmp is changed
> > and R is aware of it. This is the purpose of the
> > 'named' element of a
> > SEXP, but I don't think that is documented anywhere.
> >
> > > else
> > > tmp <- tmp.last
> > > ...
> > > .Call("replace",tmp,...)
> > > }
> > > ####################################
> > >
> > >
> > > When I try to recover tmp
> > >
> > > tmp <- tmp.last
> > >
> > > I got the modified value of tmp.
> > > It means that tmp.last is modified
> > > when I modified tmp in the C funciont replace.
> > >
> > > The program seems to work fine if I change
> > > to this::
> > >
> > > tmp.last <- tmp*1.0
> > >
> > > tmp <- tmp.last*1.0
> >
> > Those do definitely make new objects.
> >
> > --
> > Brian D. Ripley,
> > ripley at stats.ox.ac.uk
> > Professor of Applied Statistics,
> > http://www.stats.ox.ac.uk/~ripley/
> > University of Oxford, Tel: +44 1865
> > 272861 (self)
> > 1 South Parks Road, +44 1865
> > 272866 (PA)
> > Oxford OX1 3TG, UK Fax: +44 1865
> > 272595
> >
>
> ______________________________________________
> R-devel at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-devel
>
>
--
Brian D. Ripley, ripley at stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UK Fax: +44 1865 272595
More information about the R-devel
mailing list