summaryrefslogtreecommitdiff
path: root/Doc/Manual/R.html
blob: 9b05922fdb48c46840dc879254d613712ea4b5f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>SWIG and R</title>
<link rel="stylesheet" type="text/css" href="style.css">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>

<body bgcolor="#ffffff">
<H1><a name="R">34 SWIG and R</a></H1>
<!-- INDEX -->
<div class="sectiontoc">
<ul>
<li><a href="#R_nn2">Bugs</a>
<li><a href="#R_nn3">Using R and SWIG</a>
<li><a href="#R_nn4">Precompiling large R files</a>
<li><a href="#R_nn5">General policy</a>
<li><a href="#R_language_conventions">Language conventions</a>
<li><a href="#R_nn6">C++ classes</a>
<ul>
<li><a href="#R_class_examples">Examples</a>
</ul>
<li><a href="#R_nn7">Enumerations</a>
</ul>
</div>
<!-- INDEX -->



<p>
R is a GPL'ed open source statistical and plotting environment.
Information about R can be found at <a
href="http://www.r-project.org/">www.r-project.org</a>.
</p>

<p>
The R bindings are under active development.  They have been used to
compile and run an R interface to QuantLib running on Mandriva Linux
with gcc. They are also used to create the SimpleITK R package, which
runs on Linux and MacOS. SWIG is used to create all wrapper
interfaces
to <a href="http://http://www.simpleitk.org/">SimpleITK</a>.  The R
bindings also work on Microsoft Windows using Visual C++.
</p>

<H2><a name="R_nn2">34.1 Bugs</a></H2>


<p>
Currently the following features are not implemented or broken:
</p>

<ul>
<li>Garbage collection of some created objects. Finalizers are
  available for wrapped C++ classes and are called by the
  garbage collection system.
<li>C Array wrappings
</ul>

<H2><a name="R_nn3">34.2 Using R and SWIG</a></H2>


<p>
To use R and SWIG in C mode, execute the following commands where
example.c is the name of the file with the functions in them
</p>

<div class="shell">
<pre>
swig -r example.i
R CMD SHLIB example_wrap.c example.c
</pre>
</div>

<p>
The corresponding options for C++ mode are
</p>

<div class="shell">
<pre>
swig -c++ -r -o example_wrap.cpp example.i
R CMD SHLIB example_wrap.cpp example.cpp
</pre>
</div>

<p>
Note that R is sensitive to the names of the files.
The name of the wrapper file must be the
name of the library unless you use the -o option to R when building the library, for example:
</p>

<div class="shell">
<pre>
swig -c++ -r -o example_wrap.cpp example.i
R CMD SHLIB -o example.so example_wrap.cpp example.cpp
</pre>
</div>

<p>
R is also sensitive to the name of the file 
extension in C and C++ mode. In C++ mode, the file extension must be .cpp
rather than .cxx for the R compile command to recognize it. If your C++ code is 
in a file using something other than a .cpp extension, then it may still work using PKG_LIBS:
</p>

<div class="shell">
<pre>
swig -c++ -r -o example_wrap.cpp example.i
PKG_LIBS="example.cxx" R CMD SHLIB -o example example_wrap.cpp
</pre>
</div>

<p>
The commands produces two files.  A dynamic shared object file called
example.so, or example.dll, and an R wrapper file called example.R.  To load these
files, start up R and type in the following commands
</p>

<div class="shell">
<pre>
dyn.load(paste("example", .Platform$dynlib.ext, sep=""))
source("example.R")
cacheMetaData(1)
</pre>
</div>

<p>
The cacheMetaData(1) will cause R to refresh its object tables.
Without it, inheritance of wrapped objects may fail.
These two files can be loaded in any order.
</p>

<p>
  If you are compiling code yourself (not using R itself), there are a few things to watch out for:
</p>

<ul>
<li>The output shared library name (to the left of the file extension) MUST match the module name, or alternatively, you can also set the -package NAME command line argument.  See swig -r -help for more information
<li>If you do not set the output file name appropriately, you might see errors like 
<div class="shell">
<pre>
&gt; fact(4)
Error in .Call("R_swig_fact", s_arg1, as.logical(.copy), PACKAGE = "example") :
  "R_swig_fact" not available for .Call() for package "example"
</pre>
</div>
<li>Make sure the architecture of the shared library(x64 for instance), matches the architecture of the R program you want to load your shared library into
</ul>

<H2><a name="R_nn4">34.3 Precompiling large R files</a></H2>


<p>
In cases where the R file is large, one make save a lot of loading
time by precompiling the R wrapper.  This can be done by creating the
file makeRData.R which contains the following
</p>

<div class="code"><pre>
source('BigFile.R')
save(list=ls(all=TRUE), file="BigFile.RData", compress=TRUE)
q(save="no")
</pre></div>

<p>
This will generate a compiled R file called BigFile.RData that
will save a large amount of loading time.
</p>

<p>
There is no need to precompile large R files if the SWIG-generated code is being included
in an R package. The package infrastructure provides this service during package installation.
</p>

<H2><a name="R_nn5">34.4 General policy</a></H2>


<p>
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.
</p>

<H2><a name="R_language_conventions">34.5 Language conventions</a></H2>


<p>
getitem and setitem use C++ conventions (i.e. zero based indices). [&lt;-
and [ are overloaded to allow for R syntax (one based indices and
slices)
</p>

<H2><a name="R_nn6">34.6 C++ classes</a></H2>


<p>
Wrapping of C++ classes for R works quite well. R has a special
type, known as an external reference, that can be used as a pointer
to arbitrary things, including C++ classes. The proxy layers generated
for other classes are not required.
</p>

<p>
  SWIG currently creates a custom hierarchy of R classes derived from the
  external reference type and implements
type checking and function overloading in the R code it generates. In
the future we hope to utilise the built in R6 class structures.
</p>

<p>
The R interface has the following capabilities:
</p>
<ul>
  <li> Destructor methods are registered and called automatically by the R garbage collector.
<li> A range of std::vector types are converted automatically to R equivalents via the std_vector.i library.
<li> The $ operator is used for method access.
<li> Variable accessors are automatically generated and called via the $, [, [[, $&lt;-,  [&lt;-, [[&lt;- operators.
</ul>

<H3><a name="R_class_examples">34.6.1 Examples</a></H3>


<p>
Consider the following simple example:
</p>

<div class="code">
  <pre>
class Vehicle {
private:
  int m_axles;

public:
  int Axles() {
    return(m_axles);
  }

  bool Available;

  Vehicle() {
    Available=false;
    m_axles=2;
  }

  Vehicle(int ax) {
    Available=false;
    m_axles=ax;
  }
};
</pre>
</div>

<p>
The following options are available in R:
</p>

<div class="code">
<pre>
v1 &lt;- Vehicle()
v2 &lt;- Vehicle(4)
# access members
v1$Axles()
[1] 2
v2$Axles
[1] 4
v1$Available
[1] FALSE
# Set availability
v1$Available &lt;- TRUE
v1$Available
[1] TRUE
</pre>
</div>
  
<p>
A useful trick to determine the methods that are available is to
query the R method definition as follows:
</p>

<div class="code">
  <pre>
# display the methods for the class
getMethod("$", class(v1))
    
Method Definition:

function (x, name) 
{
    accessorFuns = list(Axles = Vehicle_Axles, Available = Vehicle_Available_get)
    vaccessors = c("Available")
    idx = pmatch(name, names(accessorFuns))
    if (is.na(idx)) 
        return(callNextMethod(x, name))
    f = accessorFuns[[idx]]
    if (is.na(match(name, vaccessors))) 
        function(...) {
            f(x, ...)
        }
    else f(x)
}

Signatures:
        x           
target  "_p_Vehicle"
defined "_p_Vehicle"

</pre>
</div>
<p>
The names in the <tt>accessorFuns</tt> list correspond to class methods while names in the <tt>vaccessors</tt> section
correspond to variables that may be modified.
</p>
<H2><a name="R_nn7">34.7 Enumerations</a></H2>


<p>
R doesn't have a native enumeration type. Enumerations are represented
as character strings in R, with calls to R functions that convert back
and forth between integers.
</p>

<p>
The details of enumeration names and contents are stored in hidden R
environments, which are named according the the enumeration name - for
example, an enumeration colour:
</p>

<div class="code"><pre>
enum colour { red=-1, blue, green = 10 };
</pre></div>

<p>
will be initialized by the following call in R:
</p>

<div class="code"><pre>
defineEnumeration("_colour",
 .values=c("red" = .Call('R_swig_colour_red_get',FALSE, PACKAGE='enum_thorough'),
"blue" = .Call('R_swig_colour_blue_get',FALSE, PACKAGE='enum_thorough'),
"green" = .Call('R_swig_colour_green_get',FALSE, PACKAGE='enum_thorough')))
</pre></div>

<p>
which will create an environment named <tt>.__E___colour</tt>. The enumeration
values are initialised via calls to C/C++ code, allowing complex
values for enumerations to be used. Calls to the C/C++ code require
the compiled library to be loaded, so a  <tt>delayedAssign</tt> is employed
within <tt>defineEnumeration</tt> in order to allow the code to be easily used in R
packages.
</p>

<p>
The user typically does not need to access the enumeration lookup
functions or know the name of the enumeration type used by
R. Attributes containing the type information are attached by swig to
functions requiring enumeration arguments or returning enumeration
values, and those attributes are used to identify and access the
appropriate environments and thus translate between characters
and integers.
</p>

<p>
The relevant functions, for debugging purposes, are <tt>enumToInteger</tt> and
<tt>enumFromInteger</tt>.
</p>

<p>
Anonymous enumerations are ignored by the binding generation process,
leaving no way of accessing the value of anonymous enumerations from R
code.
</p>

</body>
</html>