From schlather at math.uni-goettingen.de  Wed Oct 10 16:35:18 2007
From: schlather at math.uni-goettingen.de (schlather at math.uni-goettingen.de)
Date: Wed, 10 Oct 2007 16:35:18 +0200 (CEST)
Subject: [Rd] documentation of .C (PR#9948)
Message-ID: <20071010143518.573DC288008C@mail.pubhealth.ku.dk>

Full_Name: Martin Schlather
Version: R version 2.7.0 Under development (unstable) (2007-10-01 r43043)
OS: Linux
Submission from: (NULL) (91.3.209.203)


Hi,

There are 2 dangers with using 'DUP=FALSE' mentioned:
  * formal arguments
  * lists

Would you also mention a third one, namely
that values in R are now only referenced  whenever 
possible and not always copied; hence .C(..., DUP=FALSE) 
may change the values of other local variables.

E.g., with C code 
   void addone(double *x) {  *x = *x + 1; }

you get 
  
  x <- as.double(1)
  y <- x
  .C("addone", x, PACKAGE="test", DUP=FALSE)
  print(c(x,y))
#[1] 2 2

  
  x <- as.double(1)
  y <- as.double(x)
 .C("addone", x, PACKAGE="test", DUP=FALSE)
  print(c(x,y))
#[1] 2 2 

  x <- as.double(1)
  y <- as.integer(x)
 .C("addone", x, PACKAGE="test", DUP=FALSE)
  print(c(x,y))
#[1] 2 1

Many thanks and kind regards,
Martin



[Rd] documentation of .C (PR#9948)
schlather at math.uni-goettingen.de