On 4 January 2016 at 21:14, Pierre Lafaye de Micheaux < laf...@dms.umontreal.ca> wrote:
> Dear all, > > Thanks again for your answers. > > For one of my project, I indeed need the special complex error functions. > This is why I used the RcppFaddeeva source files in the first time. > That's useful to know. In that case, I believe something could be done but I'd need some help from Dirk to make sure the package export the right things. https://github.com/baptiste/rcppfaddeeva/pull/2#issuecomment-109682706 > This being said, it was ALSO a workaround to get access to complex numbers > operations (and so that the package compile under Windows > without errors). > This workaround is clearly suboptimal and needs to be sorted first IMHO. I'm guessing that's a magic side-effect of the Rcpp.h include in one of the files. > I know that using .C() is now discouraged by R core group. This being > said, I am a bit reluctant, at least for some projects, to use .Call(). > I like the idea to be able to use old FORTRAN77 codes and/or C codes > written by others. Usually, using these codes is quite straightforward > thanks to the .Fortran() interface. As for the C codes, it is only > necessary to modify the arguments of the C function to make them pointers in > order to then call it through the .C() function. > > My understanding, but maybe I am not good enough, is that to be able to > call a C/C++ function using .Call() and/or involving Rcpp needs > a lot more modifications to the original C source file. > If you look at RcppFaddeeva, you'll find that the original C+ library is pretty much untouched, and the c++ wrappers are quite minimal. And with Rcpp attributes, you don't even have to write R wrappers. I think this is bad for reproducibility. For example, if one would like to > call this same C code from Matlab and if this C code is full of Rcpp, then > I guess there will be some trouble. Am I right? > Note that I "learned" a bit of Rcpp. I am the author and maintainer of > package PoweR: > https://cran.r-project.org/web/packages/PoweR/index.html > I wrote in this package the file calcpuissRcpp.cpp that contains some Rcpp > features (maybe you can have a quick look to see my low? level > of knowledge of Rcpp). And I agree that this is cool stuff when you want > to be able to access high level > R functions from C. But as said above, you loose some reproducibility (in > the sense explained above) and maybe also some speed (and this is why I > have two "parallel" versions in my PoweR package: calcpuiss.cpp and > calcpuissRcpp.cpp). > > So, with all this in mind, my "request" is still the same. Namely being > able to manipulate (and create) complex numbers at the (pure) C level in an > R package so that it could compile properly (without errors) under > Microsoft Windows. I found this workaround by copying these RcppFaddeeva > source files > (.cpp and .h files) in the src/ directory of my package(s) but this is not > really clean. Probably I could try to remove all "unnecessary" stuff from > these source > files in order to keep only what is really needed to play with complex > numbers at the (pure) C level, but maybe there would be something more > clever to do? Like adding RcppFaddeeva to the LinkingTo/Depends/Export > fields? I believe this step (to use some of Faddeeva's functions) needs some work in RcppFaddeeva, which I'd be happy to discuss with you and hopefully Dirk, but that's a different issue altogether. Or creating a very simple package (by removing all special complex error > functions from RcppFaddeeva) Sounds like a good idea to me. And if you put it on github, say, people could look at it if you get stuck. As I remember, Dirk fixed my RcppFaddeeva package faster than I was committing to it. HTH, baptiste and call the resulting package EnableC and then add this to > LinkingTo/Depends/Export fields? > I hope I made myself clear ... > > Thank you again for your time. > > Best regards, > > Pierre L. > > > Le 03/01/2016 22:14, Dirk Eddelbuettel a écrit : > >> On 4 January 2016 at 09:50, Baptiste Auguie wrote: >> | Hi, >> | >> | Just to clarify: did you include files from RcppFaddeeva because you >> need some >> | of its functionality (special complex error functions), or was it only a >> | workaround to get access to complex numbers? In the latter case, I >> recommend >> | you try making a minimal Rcpp package to see how easy it is to >> interface with >> | C++ functions, and that way you will only have relevant header files >> included. >> >> +1 >> >> I already responded to Pierre's initial emails in November and tried then >> to >> explain to him that that .C() is a _really bad idea at this point in time. >> >> It is two months later and nothing has changed. >> >> So here is a quick illustration of what Baptiste meant. All it takes is >> >> library(Rcpp) # no other depends >> >> and then (and I even got this right on first try): >> >> R> cppFunction("Rcomplex addTwo(Rcomplex x, Rcomplex y) {return x + >> y; }") >> R> addTwo(2+2i, 3+3i) >> [1] 5+5i >> R> >> >> With one invocation of cppFunction() I created an ad-hoc compiled function >> (technically compiled as C++ but you can call this C as well) which adds >> two >> complex number -- one of Pierre's request as per the email below. And low >> and behold is just does that. >> >> So yes -- maybe time to learn some Rcpp, maybe forget about .C() and >> simply >> get on with this and other other things. >> >> Dirk >> >> | >> | Best, >> | >> | baptiste >> | >> | >> | >> | On 4 January 2016 at 09:36, Pierre Lafaye de Micheaux < >> laf...@dms.umontreal.ca> >> | wrote: >> | >> | Dear all, >> | >> | This email comes after a discussion on the R-pkg-devel mailing list: >> | https://stat.ethz.ch/pipermail/r-package-devel/2016q1/000627.html >> | >> | My purpose was to be able, in two of my packages, to use complex >> numbers >> | (create some, addition, multiplication, division, modulus, etc) >> | directly in a C code that is called from R (using the .C interface). >> | Note that these complex numbers might not come from R but could be >> created >> | and used directly in my C code, that will then output (via pointers) >> | real (I mean double) values back to R (via the .C interface). I >> could also >> | send from R these complex numbers via the .C interface. >> | >> | A very simple example of such a function called from R via the .C >> interface >> | could be the following: >> | >> | #include <R.h> >> | #include "Rmath.h" >> | extern "C" { >> | void Cfunc(complex double *var) { >> | double _Complex z = 1.0 + 2.0 * _Complex_I; >> | var[0] = z + exp(var[0]); >> | return; >> | }} >> | >> | I could call this function from R as follows: >> | .C(1i) >> | >> | No problem so far when I use such a function in a package that is >> compiled >> | under Linux. But this will not work under windows (see the >> discussion >> | on the R-pkg-devel list). So what I did to make everything work >> under >> | Windows also was to include in the src/ directory of my package the >> source >> | files >> | from the RcppFaddeeva package. Then I would modify the function >> above as >> | follows: >> | >> | #include <R.h> >> | #include "Rmath.h" >> | #include "libraries/callFaddeeva.cpp" >> | #include "libraries/Faddeeva.cpp" >> | #include "libraries/RcppExports.cpp" >> | extern "C" { >> | void Cfunc(complex double *var) { >> | cmplx z = C(1.0, 2.0); >> | var[0] = z + cexp(var[0]); >> | return; >> | }} >> | >> | Maybe there is a way not to include all the Faddeeva source files >> in my >> | packages? But I do not know how to do it. >> | >> | Best regards, >> | >> | Pierre L. >> | >> | >> | >> | -- >> | Pierre Lafaye de Micheaux >> | >> | Adresse courrier: >> | Université de Montréal >> | Pavillon André-Aisenstadt >> | Département de Mathématiques et Statistique >> | CP 6128 Succursale Centre-ville >> | Montréal Qc H3C 3J7 >> | CANADA >> | >> | Adresse physique: >> | Département de Mathématiques et Statistique >> | Bureau 4249, Pavillon André-Aisenstadt >> | 2920, chemin de la Tour >> | Montréal, Québec H3T 1J4 >> | CANADA >> | >> | Tél.: (00-1) 514-343-6607 / Fax: (00-1) 514-343-5700 >> | laf...@dms.umontreal.ca >> | http://www.biostatisticien.eu >> | >> | _______________________________________________ >> | 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 >> >> > -- > Pierre Lafaye de Micheaux > > Adresse courrier: > Université de Montréal > Pavillon André-Aisenstadt > Département de Mathématiques et Statistique > CP 6128 Succursale Centre-ville > Montréal Qc H3C 3J7 > CANADA > > Adresse physique: > Département de Mathématiques et Statistique > Bureau 4249, Pavillon André-Aisenstadt > 2920, chemin de la Tour > Montréal, Québec H3T 1J4 > CANADA > > Tél.: (00-1) 514-343-6607 / Fax: (00-1) 514-343-5700 > laf...@dms.umontreal.ca > http://www.biostatisticien.eu > >
_______________________________________________ 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