Hello,

We don't know your function f, so this is hard to say. Anyway, this below implements something similar to apply(.,1,paste0) in rcpp (current devl version):

#include <Rcpp.h>
using namespace Rcpp ;

// [[Rcpp::export]]
CharacterVector pasteColumns(CharacterMatrix m){
    String buffer ;
    int nc = m.ncol(), nr = m.nrow() ;
    CharacterVector out(nr) ;
    for( int i=0; i<nr; i++){
        CharacterMatrix::Row row = m(i,_) ;
        buffer = "" ;
        for( int j=0; j<nc; j++){
            buffer += row[j] ;
        }
        out[i] = buffer ;
    }
    return out ;
}

With this, I get these timings:

    nc <- 100; nr <- 2e4
    M <- matrix( sample(letters, nc*nr, replace = TRUE) , ncol = nc )

    require(microbenchmark)
    microbenchmark(
        pasteColumns(M),
        apply(M, 1, paste0)
        )
    Unit: milliseconds
                 expr       min        lq    median        uq      max
    1 apply(M, 1, paste0) 451.39975 484.41435 495.92757 501.58728 714.1418
    2     pasteColumns(M)  67.91322  68.29269  70.34704  77.09383 145.9161



Le 10/12/12 23:43, [email protected] a écrit :
I preface this by stating that I'm very much a Rcpp beginner who is
comfortable in R but I've never before used C++. I'm working through the
Rcpp documentation but haven't been able to answer my question.

I've written an Rcpp (v0.10.1) function f that takes as input a
CharacterMatrix X. X has 20 million rows and 100 columns. For each row
of X the function alters certain entries of that row according to rules
governed by some other input variables. f returns the updated version of
X. This function works as I'd like it to:
# a toy example with nrow = 2, ncol = 2
 > X <- matrix('A', ncol = 2, nrow = 2)
 > X
      [,1] [,2]
[1,] "A"  "A"
[2,] "A"  "A"
 > X <- f(X, other_input_variables)
 > X
      [,1] [,2]
[1,] "Z"  "A"
[2,] "z"  "A"

However, instead of f returning a CharacterMatrix as it currently does,
I'd like to return a CharacterVector Y, where each element of Y is a
"collapsed" row of the updated X.

I can achieve the desired result in R by using:
Y <- apply(X=X, MARGIN = 1, FUN = function(x){paste0(x, collapse = '')})
 > Y
[1] "ZA" "zA"

but I wondered whether this "joining" is likely to be more efficiently
performed within my function f? If so, how do I join the 100 individual
character entries of a row of the CharacterMatrix X into a single string
that will then comprise an element of the returned CharacterVector Y?

Many thanks,
Pete
--------------------------------
Peter Hickey,
PhD Student/Research Assistant,
Bioinformatics Division,
Walter and Eliza Hall Institute of Medical Research,
1G Royal Parade, Parkville, Vic 3052, Australia.
Ph: +613 9345 2324

[email protected] <mailto:[email protected]>
http://www.wehi.edu.au


--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30

R Graph Gallery: http://gallery.r-enthusiasts.com

blog:            http://romainfrancois.blog.free.fr
|- http://bit.ly/RE6sYH : OOP with Rcpp modules
`- http://bit.ly/Thw7IK : Rcpp modules more flexible

_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to