@@ -91,8 +91,11 @@ These converters are often used implicitly, as in the following code chunk:
91
91
92
92
<<echo =FALSE >>=
93
93
code <- '
94
- // we get a list from R
95
- List input(input_) ;
94
+ #include <Rcpp.h>
95
+ using namespace Rcpp;
96
+
97
+ // [[Rcpp::export]]
98
+ List fx(List input){ // we get a list from R
96
99
97
100
// pull std::vector<double> from R list
98
101
// this is achieved through an implicit call to Rcpp::as
@@ -103,7 +106,8 @@ std::vector<double> x = input["x"] ;
103
106
return List::create(
104
107
_["front"] = x.front(),
105
108
_["back"] = x.back()
106
- ) ;
109
+ );
110
+ }
107
111
'
108
112
writeLines( code , " code.cpp" )
109
113
@
@@ -112,10 +116,7 @@ external_highlight( "code.cpp", type = "LATEX", doc = FALSE )
112
116
@
113
117
114
118
<<>>=
115
- fx <- cxxfunction( signature( input_ = " list" ),
116
- paste( readLines( " code.cpp" ), collapse = " \n " ),
117
- plugin = " Rcpp"
118
- )
119
+ Rcpp :: sourceCpp(file = " code.cpp" )
119
120
input <- list ( x = seq(1 , 10 , by = 0.5 ) )
120
121
fx( input )
121
122
@
@@ -186,6 +187,18 @@ It should be noted that only the declaration is required. The implementation
186
187
can appear after the \texttt {Rcpp.h } file is included, and therefore take
187
188
full advantage of the \pkg {Rcpp} type system.
188
189
190
+ Another non-intrusive option is to expose an external pointer. The macro
191
+ \texttt {RCPP\_ EXPORT\_ WRAP } provides an easy way to expose a \proglang {C++} class
192
+ to \proglang {R} as an external pointer. It can be used instead of specializing
193
+ \texttt {Rcpp::wrap }, and should not be used simultaneously.
194
+
195
+ <<lang =cpp >>=
196
+ # include RcppCommon.h
197
+ # include foobar.h
198
+
199
+ RCPP_EXPORT_WRAP(Bar );
200
+ @
201
+
189
202
\subsection {Templates and partial specialization }
190
203
191
204
It is perfectly valid to declare a partial specialization for the
@@ -227,8 +240,6 @@ will attempt to use the constructor of the target class taking a \texttt{SEXP}.
227
240
<<lang =cpp >>=
228
241
# include <RcppCommon.h>
229
242
230
- # include <RcppCommon.h>
231
-
232
243
class Foo {
233
244
public :
234
245
Foo() ;
@@ -237,18 +248,16 @@ class Foo{
237
248
Foo(SEXP ) ;
238
249
}
239
250
240
- # include <Rcpp.h>
241
-
242
251
243
252
// this must appear after the specialization ,
244
253
// otherwise the specialization will not be seen by Rcpp types
245
254
# include <Rcpp.h>
246
255
@
247
256
248
- \subsection {Non intrusive extension }
257
+ \subsection {Non- intrusive extension }
249
258
250
259
It is also possible to fully specialize \texttt {Rcpp::as } to enable
251
- non intrusive implicit conversion capabilities.
260
+ non- intrusive implicit conversion capabilities.
252
261
253
262
<<lang =cpp >>=
254
263
# include <RcppCommon.h>
@@ -266,6 +275,28 @@ namespace Rcpp {
266
275
# include <Rcpp.h>
267
276
@
268
277
278
+ Furthermore, another non-intrusive option is to opt for sharing an R
279
+ external pointer. The macro \texttt {RCPP\_ EXPORT\_ AS } provides an easy way to
280
+ extend \texttt {Rcpp::as } to expose \proglang {R} external pointers to
281
+ \proglang {C++}. It can be used instead of specializing \texttt {Rcpp::as }, and
282
+ should not be used simultaneously.
283
+
284
+ <<lang =cpp >>=
285
+ # include RcppCommon.h
286
+ # include foobar.h
287
+
288
+ RCPP_EXPORT_AS(Bar );
289
+ @
290
+
291
+ With this being said, there is one additional macro that can be used to
292
+ simultaneously define both \texttt {Rcpp::wrap } and \texttt {Rcpp::as }
293
+ specialization for an external pointer. The macro \texttt {RCPP\_ EXPOSED\_ CLASS }
294
+ can be use to transparently exchange a class between \proglang {R} and
295
+ \proglang {C++} as an external pointer. Do not simultaneously use it alongside
296
+ \texttt {RCPP\_ EXPOSED\_ AS }, \texttt {RCPP\_ EXPOSED\_ WRAP }, \texttt {Rcpp::wrap }, or
297
+ \texttt {Rcpp::as }.
298
+
299
+
269
300
\subsection {Templates and partial specialization }
270
301
271
302
The signature of \texttt {Rcpp::as } does not allow partial specialization.
0 commit comments