# R: Trace Copying of Objects

tracemem {base} | R Documentation

## Trace Copying of Objects

### Description

This function marks an object so that a message is printed whenever the internal function `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

`x` | An R object, not a function or environment or `NULL`.
`previous` | A value as returned by `tracemem` or `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. `tracemem` and `untracemem` give errors when R is not compiled with memory profiling; `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 `duplicate` or by arithmetic or mathmetical operations produces a message to standard output. The message consists of the string `tracemem`, the identifying strings for the object being copied and the new object being created, and a stack trace showing where the duplication occurred. `retracemem()` is used to indicate that a variable should be considered a copy of a previous variable (e.g. after subscripting).

The messages can be turned off with `tracingState`.

It is not possible to trace functions, as this would conflict with `trace` and it is not useful to trace `NULL`, environments, promises, weak references, or external pointer objects, as these are not duplicated.

### Value

A character string for identifying the object in the trace output (an address in hex enclosed in angle brackets), or `NULL` (invisibly for `untracemem`.

### See Also

`trace`, `Rprofmem`

http://developer.r-project.org/memory-profiling.html

### Examples

    ## Not run:
    a <- 1:10
    tracemem(a)
    ## b and a share memory
    b <- a
    b[1] <- 1
    untracemem(a)

    ## copying in lm
    d <- stats::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
    ## End(Not run)

[Package base version 2.6.0 Index]