[Rcpp-devel] Using complex numbers in a C program called by R

Pierre Lafaye de Micheaux lafaye at dms.umontreal.ca
Mon Jan 4 09:14:10 CET 2016


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.
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).

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.

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? Or creating a very simple package (by removing all special 
complex error
functions from RcppFaddeeva) 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 <lafaye at 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
> |     lafaye at dms.umontreal.ca
> |     http://www.biostatisticien.eu
> |
> |     _______________________________________________
> |     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
> |
> |
> | _______________________________________________
> | 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
>

-- 
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
lafaye at dms.umontreal.ca
http://www.biostatisticien.eu



More information about the Rcpp-devel mailing list