Thank you! It works great!

Here is what I did:

src <- '
    using namespace Rcpp;
    double y = 9;
    NumericVector z(1);
    z[0] = 100.1;

    f1(y, z);
    z[0] = z[0] + 1;
    return z;
'

f2 <- cxxfunction(signature(), body = src, plugin = "Rcpp", includes = "#include <C:/Users/Marie/Documents/R/fxwithinfxCompiled/f1.txt>")

This is my code file called f1.txt:
#ifndef _fxwithinfx_f1_H
#define _fxwithinfx_f1_H

#include <Rcpp.h>

extern "C" int f1(double y, SEXP z) ;

#endif

#include "f1.h"

int f1(double y, SEXP z){
  using namespace Rcpp;

  NumericVector zz(z);
  zz[0] = y + 1.5;
  return(0);
}

Marie

On 04/06/2012 5:36 PM, Douglas Bates wrote:
On Mon, Jun 4, 2012 at 4:19 AM, Marie Auger-Methe
<marie.augerme...@gmail.com>  wrote:
Hi list,
I am writing a Rcpp function (referred as f2). To be able to debug it, I am
currently using inline to write f2. f2 uses a function that I've wrote and
is now part of a package that I have made (referred as f1). f1 is an Rcpp
function that is not called within R but only called from Rcpp functions. I
was wondering how I could use this f1 function within f2 when using inline.
 From what I understand I should be able to use the argument includes from
cxxfunction. I think it is related to this thread:
http://thread.gmane.org/gmane.comp.lang.r.rcpp/2593/focus=2600
But I can't quite figure out.
Unfortunately, it's complicated if you want to access the compiled
code from another package.   There is a mechanism for another
package's compiled C functions but it is somewhat unwieldy.  If you
want to access another package's compiled C++ classes and methods and
stand-alone functions you need to arrange for the compiled code to be
in a known location and have this location on the path for the loader.
  The Rcpp package does this but getting the details right on multiple
platforms is tricky.

Perhaps the easiest approach is to include not only the headers but
all the C++ code in the file listed in the includes argument to
cxxfunction.  It's a bit wasteful but at least it works. :-)

Here is a small example:

library(inline)
library(fxwithinfx) # My package that contain f1

src<- '
   using namespace Rcpp;
   double y = 9;
   NumericVector z(1);

   f1(y, z);
   z[0] = z[0] + 1;
   return z;
   '
f2<- cxxfunction(signature(),  body = src, plugin = "Rcpp", includes =
"#include<fxwithinfx/f1.h>")

# I get the following error:

Error in compileCode(f, code, language = language, verbose = verbose) :
   Compilation ERROR, function(s)/method(s) not created!
file11741d6932c4.cpp:19:27: fatal error: fxwithinfx/f1.h: No such file or
directory
compilation terminated.
# I tried to change the reference to f1.h by changing the path, but whatever
path I give I still get an error. For example, if I use this instead:
f2<- cxxfunction(signature(),  body = src, plugin = "Rcpp",
                      includes = "#include
<C:/Users/Marie/Documents/R/fxwithinfx/src/f1.h>")
# I get the following error:

Error in compileCode(f, code, language = language, verbose = verbose) :
   Compilation ERROR, function(s)/method(s) not created!
file11743a6031d8.o:file11743a6031d8.cpp:(.text+0x104): undefined reference
to `f1'
collect2: ld returned 1 exit status

# I'm actually not sure whether I should refer the actual .h location or to
the location within my R libraries

# Here are the header and  src codes for the f1

f1.h:

#ifndef _fxwithinfx_f1_H
#define _fxwithinfx_f1_H

#include<Rcpp.h>

extern "C" int f1(double y, SEXP z) ;

#endif


f1.cpp:

#include "f1.h"

int f1(double y, SEXP z){
   using namespace Rcpp;

   NumericVector zz(z);
   zz[0] = y + 1.5;
}



Any help will be appreciated!

Marie


_______________________________________________
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

Reply via email to