Martin Møller Skarbiniks Pedersen
2017-Dec-03 01:06 UTC
[R] Rcpp, dyn.load and C++ problems
Hi, I have written a small C++ function and compile it. However in R I can't see the function I have defined in C++. I have read some web-pages about Rcpp and C++ but it is a bit confusion for me. Anyway, This is the C++-code: #include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] List compute_values_cpp(int totalPoints = 1e5, double angle_increment 0.01, int radius = 400, double grow = 3.64) { double xn = 0.5; double angle = 0.1; double xn_plus_one, yn_plus_one; NumericVector x(totalPoints); NumericVector y(totalPoints); for (int i=0; i<totalPoints; i++) { xn_plus_one = xn*cos(angle)*radius; yn_plus_one = xn*sin(angle)*radius; angle += angle_increment; xn = grow*xn*(1-xn); x[i] = xn_plus_one; y[i] = yn_plus_one; } return List::create(Rcpp::Named("x") = x, Rcpp::Named("y") = y); } And I compile it like this: PKG_CXXFLAGS=$(Rscript -e 'Rcpp:::CxxFlags()') \ PKG_LIBS=$(Rscript -e 'Rcpp:::LdFlags()') \ R CMD SHLIB logistic_map.cpp without problems and I get a logistic_map.so file as expected. However in R: R> dyn.load("logistic_map.so") R> compute_values_cpp() Error in compute_values_cpp() : could not find function "compute_values_cpp" Please advise, What piece of the puzzle is missing? Regards Martin M. S. Pedersen [[alternative HTML version deleted]]
.Call("compute_values_cpp") Also, if you were passing arguments to the C++ function you would need to declare the function differently. Do a search on "Rcpp calling C++ functions from R" HTH, Eric On Sun, Dec 3, 2017 at 3:06 AM, Martin M?ller Skarbiniks Pedersen < traxplayer at gmail.com> wrote:> Hi, > > I have written a small C++ function and compile it. > However in R I can't see the function I have defined in C++. > I have read some web-pages about Rcpp and C++ but it is a bit confusion > for me. > > Anyway, > This is the C++-code: > > #include <Rcpp.h> > using namespace Rcpp; > > // [[Rcpp::export]] > List compute_values_cpp(int totalPoints = 1e5, double angle_increment > 0.01, int radius = 400, double grow = 3.64) { > double xn = 0.5; > double angle = 0.1; > double xn_plus_one, yn_plus_one; > NumericVector x(totalPoints); > NumericVector y(totalPoints); > > for (int i=0; i<totalPoints; i++) { > xn_plus_one = xn*cos(angle)*radius; > yn_plus_one = xn*sin(angle)*radius; > angle += angle_increment; > xn = grow*xn*(1-xn); > x[i] = xn_plus_one; > y[i] = yn_plus_one; > } > return List::create(Rcpp::Named("x") = x, Rcpp::Named("y") = y); > } > > And I compile it like this: > PKG_CXXFLAGS=$(Rscript -e 'Rcpp:::CxxFlags()') \ > PKG_LIBS=$(Rscript -e 'Rcpp:::LdFlags()') \ > R CMD SHLIB logistic_map.cpp > without problems and I get a logistic_map.so file as expected. > > However in R: > R> dyn.load("logistic_map.so") > R> compute_values_cpp() > Error in compute_values_cpp() : > could not find function "compute_values_cpp" > > Please advise, > What piece of the puzzle is missing? > > Regards > Martin M. S. Pedersen > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/ > posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >[[alternative HTML version deleted]]
Martin Møller Skarbiniks Pedersen
2017-Dec-03 19:00 UTC
[R] Rcpp, dyn.load and C++ problems
On 3 December 2017 at 05:23, Eric Berger <ericjberger at gmail.com> wrote:> .Call("compute_values_cpp") > Also, if you were passing arguments to the C++ function you would need to > declare the function differently. > Do a search on "Rcpp calling C++ functions from R" > >Hi, It is still not working. $ ./compile.sh g++ -I/usr/include/R/ -DNDEBUG -D_FORTIFY_SOURCE=2 -I/home/tusk/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include -fpic -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt -c logistic_map.cpp -o logistic_map.o g++ -shared -L/usr/lib64/R/lib -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -o logistic_map.so logistic_map.o -L/usr/lib64/R/lib -lR $ readelf -Ws logistic_map.so | grep -i comp 89: 0000000000002a50 2356 FUNC GLOBAL DEFAULT 9 _Z18compute_values_cppidid 141: 0000000000002a50 2356 FUNC GLOBAL DEFAULT 9 _Z18compute_values_cppidid $ R R> dyn.load("logistic_map.so") R> .Call("compute_values_cpp") Error in .Call("compute_values_cpp") : C symbol name "compute_values_cpp" not in load table Hmm.> HTH, > Eric > > > On Sun, Dec 3, 2017 at 3:06 AM, Martin M?ller Skarbiniks Pedersen < > traxplayer at gmail.com> wrote: > >> Hi, >> >> I have written a small C++ function and compile it. >> However in R I can't see the function I have defined in C++. >> I have read some web-pages about Rcpp and C++ but it is a bit confusion >> for me. >> >> Anyway, >> This is the C++-code: >> >> #include <Rcpp.h> >> using namespace Rcpp; >> >> // [[Rcpp::export]] >> List compute_values_cpp(int totalPoints = 1e5, double angle_increment >> 0.01, int radius = 400, double grow = 3.64) { >> double xn = 0.5; >> double angle = 0.1; >> double xn_plus_one, yn_plus_one; >> NumericVector x(totalPoints); >> NumericVector y(totalPoints); >> >> for (int i=0; i<totalPoints; i++) { >> xn_plus_one = xn*cos(angle)*radius; >> yn_plus_one = xn*sin(angle)*radius; >> angle += angle_increment; >> xn = grow*xn*(1-xn); >> x[i] = xn_plus_one; >> y[i] = yn_plus_one; >> } >> return List::create(Rcpp::Named("x") = x, Rcpp::Named("y") = y); >> } >> >> And I compile it like this: >> PKG_CXXFLAGS=$(Rscript -e 'Rcpp:::CxxFlags()') \ >> PKG_LIBS=$(Rscript -e 'Rcpp:::LdFlags()') \ >> R CMD SHLIB logistic_map.cpp >> without problems and I get a logistic_map.so file as expected. >> >> However in R: >> R> dyn.load("logistic_map.so") >> R> compute_values_cpp() >> Error in compute_values_cpp() : >> could not find function "compute_values_cpp" >> >> Please advise, >> What piece of the puzzle is missing? >> >> Regards >> Martin M. S. Pedersen >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide http://www.R-project.org/posti >> ng-guide.html >> and provide commented, minimal, self-contained, reproducible code. >> > >-- Til uvedkommende, der l?ser med: Der er ingen grund til at l?se min mail. Jeg har intet at g?re med FARC, al-Jihad, al-Qaida, Hamas, Hizb al-Mujahidin eller ETA. Jeg har aldrig gjort Zakat, g?r ikke ind for Istishad, har ikke lavet en bilbombe eller kernev?ben og jeg ved d?rligt nok, hvad Al Manar og ????? betyder. Men tak for den udviste interesse. Leve Ligemageriet! Styrk p?belv?ldet! Bevar misundelsesafgifterne og cafepengene! Hurra for ?ldrebyrden! [[alternative HTML version deleted]]
Martin Møller Skarbiniks Pedersen
2017-Dec-03 19:04 UTC
[R] Rcpp, dyn.load and C++ problems
On 3 December 2017 at 05:23, Eric Berger <ericjberger at gmail.com> wrote:> > Do a search on "Rcpp calling C++ functions from R" >Thanks. However search for "Rcpp calling C++ functions from R" gives a lot of result but I think some of them are outdated and others don't agree with each other. Can you point to a specific good on-line guide for me? Regards Martin [[alternative HTML version deleted]]
Martin, You are making your life way too complicated. There are a number of things I would do differently: 0) Wrong list. Rcpp has its down, rcpp-devel, and I basically do not read this and would have missed this were it not for luck. On 3 December 2017 at 02:06, Martin M?ller Skarbiniks Pedersen wrote: | I have read some web-pages about Rcpp and C++ but it is a bit confusion | for me. 1) Keep reading. | And I compile it like this: | PKG_CXXFLAGS=$(Rscript -e 'Rcpp:::CxxFlags()') \ | PKG_LIBS=$(Rscript -e 'Rcpp:::LdFlags()') \ | R CMD SHLIB logistic_map.cpp | without problems and I get a logistic_map.so file as expected. 2) Possible but too complicated. Read on. | However in R: | R> dyn.load("logistic_map.so") 3) You never ever need that with Rcpp and its tool, unless you insist on redoing thing by hand in which case you _must_ use SEXP .Call(SEXP a, ...) | Please advise, | What piece of the puzzle is missing? 4) Keep reading. I will pivot to you other mails. Solution below. On 3 December 2017 at 20:00, Martin M?ller Skarbiniks Pedersen wrote: | Hi, | It is still not working. | $ ./compile.sh 5) Still wrong. On 3 December 2017 at 20:04, Martin M?ller Skarbiniks Pedersen wrote: | Thanks. However search for "Rcpp calling C++ functions from R" gives a lot | of result but I think | some of them are outdated and others don't agree with each other. | | Can you point to a specific good on-line guide for me? 6) Call me crazy but maybe the nine vignettes included with the package? In essence you _complitely_ missed what Rcpp Attributes does and shows, as does the (newer) Rcpp Introduction vignette. More crazy, your file was actually 100% correct. I just added three lines to _also_ execute R code (and I indented just for clarity) /*** R res <- compute_values_cpp() str(res) */ Then in R: R> library(Rcpp) R> sourceCpp("/tmp/mmsp.cpp") R> res <- compute_values_cpp() R> str(res) List of 2 $ x: num [1:100000] 199 362 118 302 262 ... $ y: num [1:100000] 20 40 14.3 39.5 36.9 ... R> _One call_ of sourceCpp() compiles AND links AND loads AND runs the example R code (which is optional). For reference, the current mmsp.cpp follows. Dirk #include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] List compute_values_cpp(int totalPoints = 1e5, double angle_increment 0.01, int radius = 400, double grow = 3.64) { double xn = 0.5; double angle = 0.1; double xn_plus_one, yn_plus_one; NumericVector x(totalPoints); NumericVector y(totalPoints); for (int i=0; i<totalPoints; i++) { xn_plus_one = xn*cos(angle)*radius; yn_plus_one = xn*sin(angle)*radius; angle += angle_increment; xn = grow*xn*(1-xn); x[i] = xn_plus_one; y[i] = yn_plus_one; } return List::create(Rcpp::Named("x") = x, Rcpp::Named("y") = y); } /*** R res <- compute_values_cpp() str(res) */ -- http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
Martin Møller Skarbiniks Pedersen
2017-Dec-03 19:30 UTC
[R] Rcpp, dyn.load and C++ problems
On 3 December 2017 at 20:19, Dirk Eddelbuettel <edd at debian.org> wrote: Hi Dirk, Thanks for your answers. I got a few more questions.> > 0) Wrong list. Rcpp has its down, rcpp-devel, and I basically do not read > this and would have missed this were it not for luck.OK. I did found the rcpp-devel mailing-list. But I though it was a developers of the rcpp-package. So it is ok to post beginners questions to rcpp-devel?> > 6) Call me crazy but maybe the nine vignettes included with the package? >OK. I will print them and read them. [...]> > Then in R: > > R> library(Rcpp) > R> sourceCpp("/tmp/mmsp.cpp") >> [...]> > _One call_ of sourceCpp() compiles AND links AND loads AND runs theexample R> code (which is optional).Basically I was searching for ways to compile to C++ code a single time and not everything the R code runs. Like I don't recompile my pure C++ programs everything I run them, only if I change something. But that is different with C++ in R? That it is normal to compile the C++ code for each run? Regards Martin [[alternative HTML version deleted]]