On 6 March 2013 at 12:07, Greg Minshall wrote:
| (since i've just been here...)
| 
| .../unitTests/runit.Vector.R has these tests:
| ----
| test.List.erase <- function(){
|     fun <- list_erase
|     d <- list( x = 1:10, y = letters[1:10] )
|     checkEquals(fun(d),
|                 list( y = letters[1:10] ),
|                 msg = "List.erase" )
| }
| 
| test.List.erase.range <- function(){
|     fun <- list_erase_range
|     d <- list( x = 1:10, y = letters[1:10], z = 1:10 )
|     checkEquals(fun(d),
|                 list( z = 1:10 ),
|                 msg = "List.erase (range version)" )
| }
| ----
| 
| the functions list_erase{,_range} are in .../unitTests/cpp/Vector.cpp:
| ----
| // [[Rcpp::export]]
| List list_erase( List list ){
|     list.erase( list.begin() ) ;
|     return list ;
| }
| 
| // [[Rcpp::export]]
| List list_erase_range( List list ){
|     list.erase( 0, 1 ) ;
|     return list ;
| }
| ----
| 
| i haven't tried these.

They are here "as a courtesy" as we otherwise support / mimic STL vector
ops.  But let us not forget that lists are vectors too, and we are in fact
bound by the vector semantics. So if you remove an element in the middle, you
are in fact copying the remainder to a new vector.  Not lightweight.

As for Rodney's question about "what is the foo[[1]] <- NULL equivalent":
that's what happens when you go multi-language. Sadly not all paradigms work
exactly the same way.

So the long asnwer is: IF you need list behaviour at the C++ level, consider
using use STL list object, not Rcpp::List object, and convert at the end.

Dirk


-- 
Dirk Eddelbuettel | e...@debian.org | http://dirk.eddelbuettel.com  
_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to