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