On 5 February 2014 at 17:07, Antonio Piccolboni wrote:
| Hi,
| I was wondering why I can serialize a call such as in
| 
| serialize(call("ripley"), NULL) 
| [1] 58 0a 00 00 00 02 00 03 00 02 00 02 03 00 00 00 00 06 00 00 00 01 00 04 00
| 09 00 00 00 06 72 69 70 6c 65 79 00 00 00 fe
| 
| but if I try from C++ the call gets evaluated
| 
|  library("Rcpp")
| 
|  rcpp.serialize = cppFunction(code="RObject my_serialize(RObject x){Function
| r_serialize(\"serialize\"); return r_serialize(x, R_NilValue);}")
| 
|  rcpp.serialize(10)
|  [1] 58 0a 00 00 00 02 00 03 00 02 00 02 03 00 00 00 00 0e 00 00 00 01 40 24
| 00 00 00 00 00 00
| # easy things work
| 
|  rcpp.serialize(call("ripley"))
| Error: could not find function "ripley"
| # wants to evaluate it
| 
|  unserialize(rcpp.serialize(call("sqrt", 2)))
| [1] 1.414214
| # How is one to serialize the call itself
| 
|  rcpp.serialize(list(call("ripley")))
|  [1] 58 0a 00 00 00 02 00 03 00 02 00 02 03 00 00 00 00 13 00 00 00 01 00 00
| 00 06 00 00 00 01 00 04 00 09 00 00 00 06 72 69 70 6c 65 79 00 00 00 fe
| #wrapping in a list is enough to stop evaluation
| 
|  eval(call("ripley"))
| Error in eval(expr, envir, enclos) : could not find function "ripley"
|  eval(list(call("ripley")))
| [[1]]
| ripley()
| 
| #OK that's consistent
| 
| 
| Could anyone enlighten me on the evaluation mechanism? Not saying it's broken,
| but certainly my expectations were off. Thanks

Did you look at eg "Section 4: Function Calls" in the Rcpp-introduction 
vignette?
Besides Rcpp::Function you could also try the Rcpp::Language class, which is
shown there.  We now also have an Rcpp::Promise class, but I have not yet used 
it. 

And in all those years with Rcpp I don't think I have used, or thought I
needed, delayed evaluation at the C++ level.  But I suspect that for example the
recent dplyr package does something along those lines, so you could look there.

Dirk

-- 
Dirk Eddelbuettel | [email protected] | http://dirk.eddelbuettel.com
_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to