[Rd] duplicate STRSXP : shallow copy ?

2010-03-07 Thread Romain Francois

Hello,

As this little program illustrates, duplicating a STRSXP does not seem 
deep enough.


require( inline )

fx - cfunction( signature( x = character), '
SEXP y = PROTECT( duplicate( x ) );
int n = LENGTH(x);
int nc = 0 ;
char* p = 0 ;
for( int i=0; in; i++){
p = (char*)( CHAR( STRING_ELT( y , i ) ) );
nc = strlen( p ) ;
for( int j=0; jnc; j++){
p[j] = tolower( p[j] ) ;
}
}
SEXP res = PROTECT( allocVector( VECSXP, 2 ) );
SET_VECTOR_ELT( res, 0, x );
SET_VECTOR_ELT( res, 1, y );
UNPROTECT(2) ;
return res ;
', includes = #include ctype.h )

I get :

 fx( c(Tick, Tack, Tock ) )
[[1]]
[1] tick tack tock

[[2]]
[1] tick tack tock

where I would expect the second element of the list to not be modified. 
Is this intended ?


If not, I can track it down to the   DUPLICATE_ATOMIC_VECTOR in 
duplicate.c and submit a patch.


Also, CHARSXP don't seem to be actually duplicated :

case CHARSXP:
return s;

Romain

--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://tr.im/OIXN : raster images and RImageJ
|- http://tr.im/OcQe : Rcpp 0.7.7
`- http://tr.im/O1wO : highlight 0.1-5

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] duplicate STRSXP : shallow copy ?

2010-03-07 Thread Romain Francois


Hello,

I understand now that this is very intended after reading: 
http://cran.r-project.org/doc/manuals/R-ints.html#The-CHARSXP-cache


So we are not supposed to modify a CHARSXP character by character.

Sorry for the noise.

Romain

On 03/07/2010 10:48 AM, Romain Francois wrote:


Hello,

As this little program illustrates, duplicating a STRSXP does not seem
deep enough.

require( inline )

fx - cfunction( signature( x = character), '
SEXP y = PROTECT( duplicate( x ) );
int n = LENGTH(x);
int nc = 0 ;
char* p = 0 ;
for( int i=0; in; i++){
p = (char*)( CHAR( STRING_ELT( y , i ) ) );
nc = strlen( p ) ;
for( int j=0; jnc; j++){
p[j] = tolower( p[j] ) ;
}
}
SEXP res = PROTECT( allocVector( VECSXP, 2 ) );
SET_VECTOR_ELT( res, 0, x );
SET_VECTOR_ELT( res, 1, y );
UNPROTECT(2) ;
return res ;
', includes = #include ctype.h )

I get :

  fx( c(Tick, Tack, Tock ) )
[[1]]
[1] tick tack tock

[[2]]
[1] tick tack tock

where I would expect the second element of the list to not be modified.
Is this intended ?

If not, I can track it down to the DUPLICATE_ATOMIC_VECTOR in
duplicate.c and submit a patch.

Also, CHARSXP don't seem to be actually duplicated :

case CHARSXP:
return s;

Romain




--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://tr.im/OIXN : raster images and RImageJ
|- http://tr.im/OcQe : Rcpp 0.7.7
`- http://tr.im/O1wO : highlight 0.1-5

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel