.cpp和.R文件的常量

时间:2015-03-09 20:23:58

标签: c++ header rcpp

我正在构建一个R包并且有一个我要声明的常量wjtConstant。我希望这个常量可以为我为包创建的R函数和.cpp函数访问

对于R函数,我可以用一行创建一个.R文件:wjtConstant = 5 并将此文件放在" R"包开发的文件夹。

对于cpp函数,我可以将以下行放在" inst / include"中的头文件中。文件夹:const int wjtConstant = 5;

我可以在两个地方声明常量,并且结果可以根据需要工作(即,常量可以由R和cpp函数使用),但这感觉很邋..有没有办法声明常量一次,并且可以同时访问R函数和cpp函数吗?

3 个答案:

答案 0 :(得分:2)

您可以在R中使用活动绑定来调用C ++函数。像这样:

#include <Rcpp.h>
using namespace Rcpp ;

const int wjtConstant = 5;

// [[Rcpp::export]]
int get_wjtConstant(){ return wjtConstant ; }

在R:

> makeActiveBinding("wjtConstant", get_wjtConstant, environment() )
> wjtConstant
[1] 5

这样你就可以在R和C ++中直接使用wjtConstant

答案 1 :(得分:1)

这是一个简单的例子:

#include <Rcpp.h>

const int theAnswer = 42;

// [[Rcpp::export]]
int getAnswer() {
  return theAnswer;
}

// [[Rcpp::export]]
void callAnswer() {
  Rcpp::Rcout << "Accessing Answer in C++: " << theAnswer << std::endl;
} 

/*** R
cat("The answer is ", getAnswer(), "\n")
cat("Calling code accessing answer\n")
callAnswer()
*/

产生:

R> Rcpp::sourceCpp("/tmp/constEx.cpp")

R> cat("The answer is ", getAnswer(), "\n")
The answer is  42 

R> cat("Calling code accessing answer\n")
Calling code accessing answer

R> callAnswer()
Accessing Answer in C++: 42
R> 

对于真正的解决方案,您将获得一个获取源的常量 来自R accessor包以及C ++使用者。我有预测系统使用这样的方案来简化/自动化参数更新。

答案 2 :(得分:0)

混合语言时,将常量或配置数据放入文件是一个简单的解决方案。该文件还允许在不重建源文件的情况下更改数据。

使用配置或数据文件时,文件的位置位于应用程序具有读取权限的文件夹中。

文件可以是任何格式,但文本格式对于使用文本编辑器进行修改很有用。二进制格式更难修改。