From taylor.arnold at yale.edu  Wed Jan 11 18:08:27 2012
From: taylor.arnold at yale.edu (Taylor Arnold)
Date: Wed, 11 Jan 2012 12:08:27 -0500
Subject: [Rd] Copying objects prior to .Call
Message-ID: <CAM3Zkc4WuKMKS-CSCu2yYnqkEzZ=_39awBOyAa=H=_DY-U1YeA@mail.gmail.com>

R-devel,

I have noticed that making a copy of an object in R prior to using
.Call on the original object can
cause the C code to alter not only the object passed to it but also
the copy in R. A simple example
is:

> x <- 2
> y <- x
> .Call("addOne", x, DUP=TRUE) # Changing DUP does not alter output
NULL
> x
[1] 3
> y
[1] 3

And corresponding simple C code:

"test.c":
#include <R.h>
#include <Rinternals.h>
#include <Rmath.h>

SEXP addOne(SEXP input) {
? REAL(input)[0] = REAL(input)[0] + 1;
? return R_NilValue;
}

I assume that this is simply a result of lazy loading in R, and well
documented. My question is, do
there exist functions to (1) force R to make a copy of an object
(force() does not work), and (2) to check
whether two objects are actually pointing to the same memory address.
For question 1, I have
found specific operations which force a copy of a given datatype, but
would prefer a more general
solution.

Thank you,

Taylor

> sessionInfo()
R version 2.14.1 (2011-12-22)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

loaded via a namespace (and not attached):
[1] tools_2.14.1


--
Taylor B. Arnold
Department of Statistics
Yale University
24 Hillhouse Avenue
New Haven, CT 06520

e-mail: taylor.arnold at yale.edu



[Rd] Copying objects prior to .Call
Taylor Arnold