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


Antonio
_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to