Also, after your comments, it just hit me why not write the entire code in pure C++? Would that be worthwhile?
On Thu, Jul 27, 2017 at 10:59 AM, Sharat <schmoo...@gmail.com> wrote: > Thanks Serguei for clearing up the data structures. I did test the > function in R but when I was printing out the results, rather than > returning a vector; sorry about that. Will be much more careful. > > On Thu, Jul 27, 2017 at 9:47 AM, Serguei Sokol <serguei.so...@gmail.com> > wrote: > >> Hi Sharat, >> >> First, few preliminary remarks before answering your question. >> 1. Just like every one asking for assistance, your should provide a >> minimal reproducible example. >> 2. Before asking about Rcpp issue, it would be reasonable if you test >> your comps() function in R, >> to be sure that the problem is not in comps() itself (and yes, there is a >> problem in comps(), cf. hereafter) >> 3. It is counter-intelligent to use Rcpp just for calling an R function. >> Sometimes such calling is >> unavoidable but doing _only_ this is a waste of time. Simply call your >> function directly from R. >> Main interest of Rcpp is to easily interface functions written in C++ >> (which are usually >> much faster then their counterparts in R) with R session. >> >> Now, about your problem. >> In fact, your version of comps() returns always NULL which causes the >> error message. >> It is because of the line: >> append(res,paste(prop1,"<-->", prop2)) >> which should be >> res=append(res,paste(prop1,"<-->", prop2)) >> >> Furthermore, when corrected and in presence of matches, comps() returns a >> string vector, not a matrix. >> So your have to invert your declarations of getGoing() making him return >> a StringVector and taking >> as argument a StringMatrix. In shorter writing, it gives: >> >> // [[Rcpp::export]] >> StringVector getGoing(StringMatrix vec){ >> Function f = Environment::global_env()["comps"]; >> return f(vec); >> } >> >> Best, >> Serguei. >> >> Le 27/07/2017 à 15:30, Sharat a écrit : >> >>> Hi: >>> >>> I'm trying to call a R function (that compares strings) in Rcpp and >>> return the result to make the comparisons run faster. Am a noob with Rcpp; >>> so please bear. The input to the R function is a matrix of 2 columns. >>> >>> The error is: *Error in getGoing(product) : Not compatible with STRSXP: >>> [type=NULL]. * >>> >>> >>> Please assist. >>> >>> #include<Rcpp.h> >>> using namespace Rcpp; >>> >>> /*** R >>> comps= function(vec) >>> { >>> streets <- vec >>> cnt <- nrow(streets) >>> res <- c() >>> print(paste0("Comparing ", (cnt)," pairs...")) >>> for (i in 1:cnt) >>> { >>> matched <- TRUE >>> prop1 = streets[i,1] >>> prop2 = streets[i,2] >>> >>> prop1_parts = strsplit(trimws(prop1), ' ') >>> prop2_parts = strsplit(trimws(prop2), ' ') >>> prop1_parts_count = length(prop1_parts[[1]]) >>> prop2_parts_count = length(prop2_parts[[1]]) >>> if (prop1_parts_count == prop2_parts_count) >>> { >>> for (x in 1:prop1_parts_count) >>> { >>> part1 = prop1_parts[[1]][x] >>> part2 = prop2_parts[[1]][x] >>> if (part1 == part2) { >>> matched = matched & TRUE >>> } >>> else if (adist(part1, part2, partial = T)==0 | >>> adist(part2,part1, partial = T)==0){ >>> matched = matched & TRUE >>> } >>> else { >>> matched = matched & FALSE >>> break >>> } >>> }#forloop ends >>> if(matched){ >>> append(res,paste(prop1,"<-->", prop2)) >>> } >>> }#if loops ends >>> }#primary for loops ends >>> res >>> }#function ends >>> */ >>> >>> // [[Rcpp::export]] >>> Rcpp::StringMatrix getGoing(Rcpp::StringVector vec){ >>> Rcpp::Environment env = Rcpp::Environment::global_env(); >>> Rcpp::Function f = env["comps"]; >>> Rcpp::StringMatrix result = f(vec); >>> return result; >>> } >>> >>> >>> >>> _______________________________________________ >>> 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 >>> >>> >> >
_______________________________________________ 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