[Rd] for help on building a R package with several R function and a bunch of c, c++

Simon Urbanek simon.urbanek at r-project.org
Mon Mar 8 21:59:33 CET 2010


Alex,

On Mar 8, 2010, at 15:44 , alex46015 at yahoo.com wrote:

> Yes! that is what I am looking for. When I post my question, I said  
> I cannot catch the key point in "Writing R Extensions".
>
> Follow your suggestion, I almost have reached my goal although I  
> passed  the R CMD check mypackage. Before I install it (I need ask  
> UNIX adminstrator to do it), I check the package, I got the  
> information
>> dyn.load("tranptest.so")
>> filenames<-c("Mrklist.txt","CCdata.txt","outputfile")
>> param<-c(1,0,1,0,1,1)
>> .C("tranptest",as.character(filenames),as.double(param))
>
> *** caught segfault ***
> address 0, cause 'memory not mapped'
>
> Traceback:
> 1: .C("tranptest",as.character(filenames), as.double(param))
>
> Do you have any clue about the error? I think it is very close tothe  
> end.
>

I don't see your C code so I can't tell -- use "R -d gdb" to run R in  
a debugger so you can look at the exact spot of the crash. Is it  
possible that you get thrown off by the 0-based indexing in C and  
opposed to 1-based indexing in R?

in
extern "C" void tranptest(char **fn, double *par) {

you want to access the values as fn[0], fn[1], fn[2] and par[0],  
par[1], par[2], .. etc.

Cheers,
Simon



> Thank you so much . You save me a tons of time,
>
> Alex
>
> --- On Mon, 3/8/10, Simon Urbanek <simon.urbanek at r-project.org> wrote:
>
>> From: Simon Urbanek <simon.urbanek at r-project.org>
>> Subject: Re: [Rd] for help on building a R package with several R  
>> function and a bunch of c, c++
>> To: alex46015 at yahoo.com
>> Cc: "Romain Francois" <romain at r-enthusiasts.com>, r-devel at r-project.org 
>> , "Dirk Eddelbuettel" <edd at debian.org>
>> Date: Monday, March 8, 2010, 12:53 PM
>> Alex,
>>
>> On Mar 8, 2010, at 12:16 , alex46015 at yahoo.com
>> wrote:
>>
>>> I built R package with only R code before, this is
>> first time I build R package with mixed R code and C, C++
>> code. I would try Rcpp on our center UNIX, before I ask the
>> administrator to install it, I need confirm several issue
>> are right. Thank you for you patient.
>>>
>>> 1, I change main function as a general function with
>> certain name such as void tranptest(char* filename[],
>> double* para[]), and copy this file and other related c,
>> c++  h, program to /src, and removed makefile.
>>>
>>
>> Yes, that's perfect - for the kind of usage you don't need
>> Rcpp at all - R supports C++ sources out of the box. Just
>> make sure your tranptest function is either in a .c file or
>> you put
>> extern "C"
>> in front of it if it's in .cpp , e.g:
>>
>> foo.cpp:
>> extern "C" void tranptest(char **fn, double *par) {
>> ...
>> }
>>
>>
>>> 2, I noticed there is Makevars after I ran
>> Rcpp.package.skeleton,
>>> do I need modify this file before I run R CMD build?
>> what I need do for  rcpp_hello_world.cpp
>> rcpp_hello_world.cpp? it is template file handled by the
>> program or it is for me to edit it as template?
>>>
>>> 3, Do I need write a R function such as
>> tranptest<-function(inputfile, ctlfile,outfile,
>> param1,param2,param3)
>>> {
>>> filenames<-c(inputfile,ctlfile,outfile)
>>> params<-as.vector(c(param1, param2,param3))
>>> .C("tranptest",
>> as.character(filenames),as.double(params))
>>> }
>>> before I run R CMD build? if so, that means I put this
>> R function in /R?
>>>
>>
>> yes, in R/foo.R (replace "foo" by any name you want)
>>
>>
>>> 4, Do I need do anything to run library.dyname to load
>> those complied objects?
>>
>> If you have a namespace just add
>> useDynLib(foo)
>> where "foo" is the name of your package. If you don't have
>> a namespace (or don't kwno what that is ;)) just add a file
>> R/zzz.R with the following content to your package:
>> .First.lib <- function(libname, pkgname)
>> library.dynam("foo", pkgname, libname)
>> where "foo" is the name of your package.
>>
>>> Where I can make sure it successful and I can use
>> .C("tranptest",....) in R before the wholepackage
>> installed?
>>>
>>
>> It's really simple - you don't need to install the package
>> to test it. Assuming "foo" is the name of your package:
>> Build the sources:
>> R CMD SHLIB -o foo.so *.c*
>>
>> start R in the same directory:
>> R
>> # load the library you just compiled
>> dyn.load("foo.so")
>> # test your code
>> .C("tranptest", c("file1", "file2"), as.double(1,2,3,4))
>>
>> Cheers,
>> Simon
>>
>>
>>>
>>> Alex
>>> --- On Mon, 3/8/10, Romain Francois <romain at r-enthusiasts.com>
>> wrote:
>>>
>>>> From: Romain Francois <romain at r-enthusiasts.com>
>>>> Subject: Re: [Rd] for help on building a R package
>> with several R function and a bunch of c, c++
>>>> To: alex46015 at yahoo.com
>>>> Cc: r-devel at r-project.org,
>> "Dirk Eddelbuettel" <edd at debian.org>
>>>> Date: Monday, March 8, 2010, 2:47 AM
>>>> Hi,
>>>>
>>>> Yes, the problem is with spaces in path names.
>> This has
>>>> been fixed and
>>>> will appear as Rcpp 0.7.8 in a few days.
>>>>
>>>> If you are in a rush, you can build it from svn,
>> or quote
>>>> the path that
>>>> is returned from CxxFlags.
>>>>
>>>> Feel free to get back to us with more questions,
>> although
>>>> I'd encourage
>>>> you to use the dedicated Rcpp-devel mailing list
>> :
>>>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
>>>>
>>>> Romain
>>>>
>>>> On 03/08/2010 04:20 AM, alex46015 at yahoo.com
>>>> wrote:
>>>>> Thank you for your help. So far what I
>> did  on
>>>> my notebook as follows. My OS is windows7.
>>>>> Â
>>>>> I downloaded Rcpp windows version, and load
>>>> library("Rcpp") then.
>>>>> Â
>>>>> 1, Change main funnction to f1.cpp, remove
>> makefile.
>>>>> 2 ,run
>>>>
>> Rcpp.package.skeleton(name="test",list=c("rec1.R","rect2.R"))
>>>>> 3, edit  /man, /R, copied my exist fileÂ
>> whch I
>>>> have done sucessfully  without any c++
>> program
>>>> before.
>>>>> 4, copy  f1.cpp and all other related
>> cpp and c
>>>> into /src/
>>>>> 5. Rcmd  build --binary test
>>>>> Â
>>>>> It showed------
>>>>> Â
>>>>> making DLL....
>>>>> gcc
>>>>
>> -l“C:/PROGRA~2/R/R-210~1.1/include",“C:/PROGRA~2/R/R-210~1.1/ 
>> bin/Rscript
>>>> -e' Rcpp:::CxxxFlags<>'` -03 -Wall -std =gnu
>> -999 -c
>>>> cranbombind.c -o cranbombind.o
>>>>> Â
>>>>> gcc.exe:
>> **\Documents/R/win-library/2.10/Rcpp/lib: No
>>>> such file or directory...
>>>>>
>>>>> I checked the path, it did have C:\Users\alex
>>>> **\Documents\R\win-library\2.10\Rcpp\lib
>>>>> Â
>>>>> I don't know how I can fix the problem. do you
>> think
>>>> it could be problem there is a space between my
>> first name
>>>> and last name..
>>>>> Â
>>>>> All I tried are on my own PC at home , I
>> will tryon
>>>> other  PC in my office.
>>>>> Â
>>>>> Do you have suggestion?. Thanks,
>>>>> Â
>>>>> Alex
>>>>> --- On Sun, 3/7/10, Romain Francois<romain at r-enthusiasts.com>
>>>> wrote:
>>>>>
>>>>>
>>>>> From: Romain Francois<romain at r-enthusiasts.com>
>>>>> Subject: Re: [Rd] for help on building a R
>> package
>>>> with several R function and a bunch of c, c++
>>>>> To: alex46015 at yahoo.com
>>>>> Cc: "Dirk Eddelbuettel"<edd at debian.org>,
>>>> r-devel at r-project.org
>>>>> Date: Sunday, March 7, 2010, 3:59 AM
>>>>>
>>>>>
>>>>> On 03/06/2010 03:27 AM, alex46015 at yahoo.com
>>>> wrote:
>>>>>> I think the first question should be how
>> to build
>>>> a R function to call a bunch of C ,C++ which
>> include one
>>>> main program, and a makefile. My goal to build a R
>> package
>>>> will be next step.
>>>>>
>>>>> You should jump straight to making a package.
>> You are
>>>> making you life
>>>>> difficult with this "main program&
>> makefile"
>>>> model.
>>>>>
>>>>> Install Rcpp and try to use the
>> Rcpp.package.skeleton,
>>>> this will create
>>>>> a simple package that uses some C++ classes
>> from Rcpp,
>>>> as well as an R
>>>>> function that calls them.
>>>>>
>>>>>> I read Rcpp , I am not sure ifÂ
>>>> RcppResultSet can solve my problem or other
>> function. Once I
>>>> make sure it work I need ask UNIX adminstrator to
>> install
>>>> it.
>>>>>
>>>>> We don't know what your problem is. We can
>> answer a
>>>> question, but we
>>>>> cannot guess the question for you.
>>>>>
>>>>> Rcpp works, please refer to our unit tests,
>> for
>>>> example look at this
>>>>> vignette:
>>>>> http://cran.r-project.org/web/packages/Rcpp/vignettes/Rcpp-unitTests.pdf
>>>>>
>>>>>> I think it shouldn't be very
>> complex,  as I
>>>> know to build a R function easy with one C
>> function.
>>>>>>
>>>>>> Thanks you for yout attention!
>>>>>>
>>>>>> Alex
>>>>>>
>>>>>> --- On Fri, 3/5/10, Dirk
>> Eddelbuettel<edd at debian.org>>>> wrote:
>>>>>>
>>>>>>
>>>>>> From: Dirk Eddelbuettel<edd at debian.org>
>>>>>> Subject: Re: [Rd] for help on building a R
>> package
>>>> with several R function and a bunch of c, c++
>>>>>> To: alex46015 at yahoo.com
>>>>>> Cc: r-devel at r-project.org
>>>>>> Date: Friday, March 5, 2010, 8:25 PM
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 5 March 2010 at 13:15, alex46015 at yahoo.com
>>>> wrote:
>>>>>> | Hope I can get quick help from here, I
>> have a
>>>> bunch of c, c++ included main function and
>> makefile. It
>>>> works well on both UNIX and windows. I tried to
>> build R
>>>> package which include this C++ program and several
>> other R
>>>> functions.  These R function here are
>>>> independent  of c++ code. I prefer to
>> define one R
>>>> function to call this c++ program (main
>> function).
>>>>>> |
>>>>>> | I know how to build R package with just
>> R
>>>> function, but I don't know how to handle those c++
>> c code
>>>> after I copied those  code  in
>> ./src, I am
>>>> reading manual "Writing R Extensions" , but I did
>> n't catch
>>>> the key point . Do you know any easy way to do it?
>> ,
>>>>>>
>>>>>> When you asked _that exact same question_
>> this
>>>> morning on r-help, you got the
>>>>>> following answer:
>>>>>>
>>>>>> Â  Â Â Â From: Whit
>> Armstrong<armstrong.whit at gmail.com>
>>>>>> Â  Â Â Â To: alex46015 at yahoo.com
>>>>>> Â  Â Â Â Cc: r-help at r-project.org
>>>>>> Â  Â Â Â Subject: Re: [R] for
>> help on
>>>> building a R package with several R function and a
>> bunch of
>>>> c, c++
>>>>>> Â  Â Â Â Date: Fri, 5 Mar 2010
>> 10:33:54
>>>> -0500
>>>>>>
>>>>>> Â  Â Â Â Pick up Rcpp, make your
>> life
>>>> easier.
>>>>>>
>>>>>> Â  Â Â Â http://dirk.eddelbuettel.com/code/rcpp.html
>>>>>>
>>>>>> Â  Â Â Â -Whit
>>>>>>
>>>>>> Â  Â Â Â On Fri, Mar 5, 2010 at
>> 9:19
>>>> AM,<alex46015 at yahoo.com>>>> wrote:
>>>>>> Â  Â Â Â>Â  Hope I can
>> get quick
>>>> help from here, I have a bunch of c, c++ included
>> main
>>>> function and makefile. It works well on both UNIX
>> and
>>>> windows. I tried to build R package which include
>> this C++
>>>> program and several other R functions.  R
>> function
>>>> here are independent  c++ code. I prefer to
>> define
>>>> one R function to call this c++ program.
>>>>>> Â  Â Â Â>
>>>>>> Â  Â Â Â>Â  Do you know
>> any easy
>>>> way to do it? I am reading manual "Writing R
>> Extensions", I
>>>> didn't catch the key point. I know how to build R
>> package
>>>> with just R function,  If I put all c++
>> code and
>>>> makefile in /src...what I need do?
>>>>>> Â  Â Â Â>
>>>>>> Â  Â Â Â>Â  Thank you
>> in
>>>> advance!
>>>>>> Â  Â Â Â>
>>>>>> Â  Â Â Â>Â  Alex
>>>>>>
>>>>>> Now, can you let us know
>>>>>>
>>>>>> Â  Â  Â  a) what part of
>> the
>>>> answer was unclear to you, and
>>>>>>
>>>>>> Â  Â  Â  b) what made
>> you think
>>>> you needed to repost _the identical question_
>> here
>>>>>>
>>>>>> | Thank you in advance!
>>>>>>
>>>>>> You're welcome.
>>>>>>
>>>>>> Dirk
>>>>
>>>> --Romain Francois
>>>> Professional R Enthusiast
>>>> +33(0) 6 28 91 30 30
>>>> http://romainfrancois.blog.free.fr
>>>> |- http://tr.im/OIXN : raster images and RImageJ
>>>> |- http://tr.im/OcQe : Rcpp 0.7.7
>>>> `- http://tr.im/O1wO : highlight 0.1-5
>>>>
>>>>
>>>
>>>
>>>
>>>
>>> ______________________________________________
>>> R-devel at r-project.org
>> mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>>
>
>
>
>
>



More information about the R-devel mailing list