\name{tracemem}
\alias{tracemem}
\alias{untracemem}
\alias{retracemem}
\title{Trace copying of objects}
\description{
This function marks an object so that a message is printed whenever the
internal function \code{duplicate} is called.   This happens when two
objects share the same memory  and one of them is modified. It is a
major cause of hard-to-predict memory use in R.  
}
\usage{
tracemem(x)
untracemem(x)
retracemem(x, previous=NULL)
}
\arguments{
  \item{x}{An R object, not a function or environment or \code{NULL}}
  \item{previous}{An address specification as returned by \code{tracemem} or \code{retracemem}}
}
\details{
This functionality is optional, determined at compilation, because it
makes R run a little  more slowly even when no objects are being
traced. \code{tracemem} and \code{untracemem} give errors when R is not
compiled with memory profiling; \code{retracemem} does not (so it can be
left in code during development).
  
When an object is traced any copying of the object by the C function
\code{duplicate} or by arithmetic or mathmetical operations produces a
message to standard output. The message consists of the string
\code{memtrace}, the identifying strings for the object being copied and
the new object being created, and a stack trace showing where the
duplication occurred. \code{retracemem()} is used to indicate that a
variable should be considered a copy of a previous variable (eg after
subscripting).

The messages can be turned off with \code{\link{tracingState}}.

It is not possible to trace functions, as this would conflict with
\code{\link{trace}} and it is not useful to trace \code{NULL},
environments, promises, weak references, or external pointer objects, as
these are not duplicated.
}
\value{
A string for identifying the object in the trace output.
}

\seealso{\code{\link{trace}}
  
  \code{\link{Rprofmem}}

  \url{http://developer.r-project.org/memory-profiling.html}
}
\examples{\dontrun{
a<-1:10
tracemem(a)
## b and a share memory
b<-a
b[1]<-1

## copying in lm
d<-rnorm(10)
tracemem(d)
lm(d~a+log(b))

## f is not a copy and is not traced
f<-d[-1]
f+1
## indicate that f should be traced as a copy of d
retracemem(f, retracemem(d))
f+1

}}
\keyword{utilities}

