如何从 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"