On 02/03/2015 8:46 AM, sarah manderni wrote:
Thanks! I went through the online posts which supports the power of .Call over .C. But my probably naive question is why does this work for my code with R but not R-devel?

Because of the change mentioned in the NEWS file.

And another question is related to using .Call. Based on the manual page, I do not need to change the function parameters when using .Call. So I can run like this:
.Call("sppedUp", D, S, pD, pS, nrow(D), as.integer(N), length(N),
           ssq[i], i, as.integer(B), overlaps, overlaps.P)

But I am receiving the memory(?) related error:
terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
Now that I am running the code using .Call.

Code using .Call is quite different from code using .C. My guess would be that you didn't get all the details right.

I generally recommend that people use Rcpp, which hides a lot of the details. It will generate your .Call calls for you, and generate the C++ code that receives them; you just need to think about the real problem, not the interface. It has its own learning curve, but I think it is easier than using the low-level code that you need to work with .Call.

Duncan Murdoch

Thanks.

On Mon, Mar 2, 2015 at 2:01 PM, Duncan Murdoch <murdoch.dun...@gmail.com <mailto:murdoch.dun...@gmail.com>> wrote:

    On 02/03/2015 3:50 AM, sarah manderni wrote:
    > Hi,
    >
    > Within my R code, I am using a C++ function as below:
    >
    >      overlaps <- matrix(0, nrow=B, ncol=length(N))
    >         overlaps.P <- matrix(0, nrow=B, ncol=length(N))
    >
    >        .C("speedUp", D, S, pD, pS, nrow(D), as.integer(N),
    length(N),
    >            ssq[i], i, as.integer(B), overlaps, overlaps.P,
    DUP=FALSE)
    >
    >
    > the function "speedUp", is supposed to update matrices overlaps and
    >  overlaps.P and it works with official R versions.
    > However, using the same code in R-devel, it does not update
    matrices and
    > they remain all zero without returning any errors.

    See the NEWS:  DUP=FALSE is now ignored.  It led to too many
    bugs.  Use
    the .Call interface if duplication causes problems.

    Duncan Murdoch

    > But, if I store the return values from C function in a variable
    lets say
    > "test" as follows:
    >
    > test <-        .C("speedUp", D, S, pD, pS, nrow(D), as.integer(N),
    > length(N),
    >            ssq[i], i, as.integer(B), overlaps, overlaps.P,
    DUP=FALSE)
    >
    > then the corresponding element of test to matrix "overlaps"
    > (test[["overlaps"]]) again has the updated values (correct
    non-zero values)
    > though the overlaps matrix itself is still empty.
    >
    > I mean in official R, the "overlaps" matrix is updated after
    calling the
    > function but not in R-devel. Also it works in both environment
    and return
    > correct values to variable "test" in R-devel as well.
    > Did you face any similar problem so that R-devel does not update the
    > variable returned by C++?
    >
    > Thanks for the help.
    >
    >       [[alternative HTML version deleted]]
    >
    > ______________________________________________
    > R-devel@r-project.org <mailto:R-devel@r-project.org> mailing list
    > https://stat.ethz.ch/mailman/listinfo/r-devel
    >



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

Reply via email to