如何从 Rcpp 调用 R 函数(不应导出)?
How to call R function (which should not be exported) from Rcpp?
我想从 Rcpp 函数调用我的包的 R 函数。 R 和 Rcpp 函数都是包 rminizinc.
的一部分
目前,我正在使用如下所示的方法:
void fun(){
Environment rmzn_env("package:rminizinc");
Function retModel = rmzn_env["getRModel"];
retModel(some_object);
}
但是,这种方法仅在我导出 getRModel()
函数时有效。有什么方法可以在不导出的情况下调用 getRModel()
,因为我希望它是一个不应向用户公开的辅助函数?
你必须在这里了解一些元信息。使用基本 R 函数 asNamespace
可以获得一个包含包中所有未导出函数的环境。这个函数本身可以在 Rcpp 中使用。然后,您从该函数的输出创建一个新的 Environment
,您可以从中获取未导出的函数。
举个例子,让我们让未导出的函数 ggplot2:::as_lower_ascii
对我们传递给 Rcpp 函数的字符串做一些工作:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
CharacterVector fun(CharacterVector input){
Function asNamespace("asNamespace");
Environment ggplot_env = asNamespace("ggplot2");
Function to_lower_ascii = ggplot_env["to_lower_ascii"];
return to_lower_ascii(input);
}
所以如果我们获取这个,那么回到 R 中我们可以这样做:
fun("HELLO WORLD")
#> [1] "hello world"
我想从 Rcpp 函数调用我的包的 R 函数。 R 和 Rcpp 函数都是包 rminizinc.
的一部分目前,我正在使用如下所示的方法:
void fun(){
Environment rmzn_env("package:rminizinc");
Function retModel = rmzn_env["getRModel"];
retModel(some_object);
}
但是,这种方法仅在我导出 getRModel()
函数时有效。有什么方法可以在不导出的情况下调用 getRModel()
,因为我希望它是一个不应向用户公开的辅助函数?
你必须在这里了解一些元信息。使用基本 R 函数 asNamespace
可以获得一个包含包中所有未导出函数的环境。这个函数本身可以在 Rcpp 中使用。然后,您从该函数的输出创建一个新的 Environment
,您可以从中获取未导出的函数。
举个例子,让我们让未导出的函数 ggplot2:::as_lower_ascii
对我们传递给 Rcpp 函数的字符串做一些工作:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
CharacterVector fun(CharacterVector input){
Function asNamespace("asNamespace");
Environment ggplot_env = asNamespace("ggplot2");
Function to_lower_ascii = ggplot_env["to_lower_ascii"];
return to_lower_ascii(input);
}
所以如果我们获取这个,那么回到 R 中我们可以这样做:
fun("HELLO WORLD")
#> [1] "hello world"