我需要简单的包装来从Rcpp代码中序列化任意R对象。下面我的代码的简化版本:如何防止Rcpp评估“调用”对象
// [[Rcpp::export]]
Rcpp::RawVector cpp_serialize(RObject x) {
Rcpp::Function serialize = Rcpp::Environment::namespace_env("base")["serialize"];
return serialize(x, R_NilValue);
}
这个伟大的工程,但我发现,call
类对象的呼叫会被序列化之前评估。我怎样才能防止这种情况发生?我只是想模仿serialize()
在R.
# Works as intended
identical(serialize(iris, NULL), cpp_serialize(iris))
# Does not work: call is evaluated
call_object <- call("rnorm", 1000)
identical(serialize(call_object, NULL), cpp_serialize(call_object))
更新:我有一个适当的解决方法(见下文),但我仍然在一个妥善的解决方案很感兴趣。
Rcpp::RawVector cpp_serialize(RObject x) {
Rcpp::Environment env;
env["MY_R_OBJECT"] = x;
Rcpp::ExpressionVector expr("serialize(MY_R_OBJECT, NULL)");
Rcpp::RawVector buf = Rcpp::Rcpp_eval(expr, env);
}
为'call'创建'call',然后可能只是顶部的'call'将被评估?只是一个随机的想法,我没有真正尝试过。 –
解决方法也在我脑海中。即使在旧的JSS论文中,我们也会展示三种不同的方式来达到'rnorm()',在这里你找到了两个。整个方法仍然不是我想做的 - 看到我现在添加的答案。 –
您不需要解决方法。你想序列化到C级的原始对象,并且有一个包给你'serializeToRaw()'作为本地C函数_。我的回答如下,downvoted两次(!!),使用它。 –