[Rcpp-devel] Fwd: Calling R function in Rcpp returns compatibility issues

Sharat schmoozed at gmail.com
Thu Jul 27 18:12:47 CEST 2017


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 <schmoozed at 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.sokol at 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 at lists.r-forge.r-project.org
>>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20170727/2ff718ad/attachment-0001.html>


More information about the Rcpp-devel mailing list