在其他c ++函数中使用c ++函数(在Rcpp中使用Rcpp)

时间:2015-07-14 12:41:48

标签: r rcpp r-package

我尝试创建一个R包(使用Rcpp)。 一切正常。但现在我写了一个c ++函数,我想在其他c ++文件中调用它。 所以在 / src 中有:

  • function1 = linearInterpolation.cpp
  • function2 = getSlope.cpp

让我们选择function1,它只是在特定位置的两个点之间进行线性插值。

#include <Rcpp.h>

using namespace Rcpp;

//' @name linearInterpolation
//' @title linearInterpolation
//' @description Twodimensional linearinterpolation for a specific point
//' @param xCoordinates Two x coordinates
//' @param yCoordinates Coresponding two y coordinates
//' @param atPosition The Point to which the interpolation shall be done
//' @return Returns the linear interpolated y-value for the specific point
//' @examples
//' linearInterpolation(c(1,2),c(1,4),3)
//'
//' @export
// [[Rcpp::export]]
double linearInterpolation(NumericVector xCoordinates, NumericVector yCoordinates, double atPosition) {

  // start + delta y / delta x_1 * delta x_2
  return yCoordinates[1] + getSlope(xCoordinates, yCoordinates) * (atPosition - xCoordinates[1]);

}

并且斜率是在不同的函数(文件)中计算的。

#include <Rcpp.h>

using namespace Rcpp;

//' @name getSlope
//' @title getSlope
//' @description Calculates the slopes between two points in 2Dimensions
//' @param xCoordinates Two x coordinates
//' @param yCoordinates Coresponding two y coordinates
//' @return Returns the slope
//' @examples
//' getSlope(c(1,2),c(1,4),3)
//'
//' @export
// [[Rcpp::export]]
double getSlope(NumericVector xCoordinates, NumericVector yCoordinates) {
  return (yCoordinates[1] - yCoordinates[0]) / (xCoordinates[1] - xCoordinates[0]);
}

我对Rcpp或c ++没有更深入的了解。我读了Vignette和编写一个使用Rcpp的软件包我想我也读了正确的部分,但我没有得到它。

为什么 getSlope 功能在其他功能中不“可见” - 因为它们都在同一个包中。 如何在其他文件中使用getSlope?

抱歉,我真的被卡住了。

谢谢和最好的问候

尼科

1 个答案:

答案 0 :(得分:3)

也许你应该制作另一个文件,一个头文件.hpp,并将其放入其中:

#include <Rcpp.h>
using namespace Rcpp;
double getSlope(NumericVector xCoordinates, NumericVector yCoordinates);

或者,更好的是,

#include <Rcpp.h>
double getSlope(Rcpp:: NumericVector xCoordinates, Rcpp:: NumericVector yCoordinates);

并将#include"myheader.hpp"放在两个cpp文件的顶部。这是为了声明这个函数,使得两个cpp文件都可以看到它。

  

......因为它们都在同一个包中

仅仅因为两个东西在同一个 R 包中,这并不意味着它们在同一个C ++ 翻译单元(即cpp文件)和翻译单元是两个C ++函数相互看到的重要内容。它们必须位于同一个cpp文件中,或者您必须使用头文件。