SWIG and R
R is a GPL'ed open source statistical and plotting environment.
Information about R can be found at www.r-project.org.
The R binding are under active development and are extremely
experimental. Not all features have been implemented and the API is
not stable.
Bugs
Currently the following features are not implemented or broken:
- Garbage collection of created objects
- C Array wrappings
- tested on UNIX only, how well or badly it works on windows is not known
Using R and SWIG
To use R and SWIG in C mode, execute the following commands where
example_func.c is the name of the file with the functions in them
swig -r -o example,c example.i
PKG_LIBS="example_func.c" R CMD SHLIB example.c
The corresponding comments for C++ mode are
swig -c++ -r -o example.cpp example.i
PKG_LIBS="example_func.cxx" R CMD SHLIB example.cpp
Note that R is sensitive to the name of the file and to the file
extension in C and C++ mode. The name of the wrapper file must be the
name of the library. Also in C++ mode, the file extension must be cpp
rather than cxx for the R compile command to recognize it.
The commands produce two files. A dynamic shared object file called
example.so and an R wrapper file called example_wrap.S. To load these
files, start up R and type in the following commands
dyn.load('example.so')
source('example_wrap.S')
These two files can be loaded in any order
General policy
The general policy of the module is to treat the C/C++ as a basic
wrapping over the underlying functions and rely on the R type system
to provide R syntax.
Language conventions
getitem and setitem use C++ conventions (i.e. zero based indices). [<-
and [ are overloaded to allow for R syntax (one based indices and
slices)
C++ classes
C++ objects are implemented as external pointer objects with the class
being the mangled name of the class. The C++ classes are encapsulated
as an SEXP with an external pointer type. The class is the mangled
name of the class. The nice thing about R is that is allows you to
keep track of the pointer object which removes the necessity for a lot
of the proxy class baggage you see in other languages.
Enumerations
enumerations are characters which are then converted back and forth to
ints before calling the C routines. All of the enumeration code is
done in R.