Этот вопрос имеет несколько толкований, поэтому я не пытался ответить раньше. Здесь решения для нескольких возможных интерпретаций:
Функция C ++, определенная с помощью Rcpp, которая вызывается из R и использует пользовательскую функцию R . Это следует http://gallery.rcpp.org/articles/r-function-from-c++/:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector callFunction(NumericVector x, NumericVector y, Function f) {
NumericVector res = f(x, y);
return res;
}
/*** R
set.seed(42)
x <- rnorm(1e5)
y <- rnorm(1e5)
rtest <- function(x, y) {
x + y
}
head(callFunction(x, y, rtest))
head(x + y)
*/
Функция R rtest
определена в R и передана в функцию C ++ callFunction
вместе с двумя ее аргументами. Частичный результат от Rcpp::sourceCpp()
:
> head(callFunction(x, y, rtest))
[1] 0.95642325 -0.57197358 -1.45084989 -0.18220091 0.07592864 0.56367202
> head(rtest(x, y))
[1] 0.95642325 -0.57197358 -1.45084989 -0.18220091 0.07592864 0.56367202
Вызов функции в R и через C ++ дает одинаковый результат.
Программа на C ++, использующая RInside, которая вызывает пользовательскую функцию R для данных, присутствующих в C ++. Здесь у нас есть две возможности: либо передать данные в R и вызвать функцию там, либо переместить функцию в C ++ и вызвать функцию R в C ++, как указано выше:
#include <RInside.h>
int main(int argc, char *argv[]) {
// define two vectors in C++
std::vector<double> x({1.23, 2.34, 3.45});
std::vector<double> y({2.34, 3.45, 1.23});
// start R
RInside R(argc, argv);
// define a function in R
R.parseEvalQ("rtest <- function(x, y) {x + y}");
// transfer the vectors to R
R["x"] = x;
R["y"] = y;
// call the function in R and return the result
std::vector<double> z = R.parseEval("rtest(x, y)");
std::cout << z[0] << std::endl;
// move R function to C++
Rcpp::Function rtest((SEXP) R.parseEval("rtest"));
// call the R function from C++
z = Rcpp::as<std::vector<double> >(rtest(x, y));
std::cout << z[0] << std::endl;
exit(0);
}
Для компиляции я использую GNUmakefile , который поставляется с примерами из RInside
. Результат:
$ make -k run
ccache g++ -I/usr/share/R/include -I/usr/local/lib/R/site-library/Rcpp/include -I/usr/local/lib/R/site-library/RInside/include -g -O2 -fdebug-prefix-map=/home/jranke/git/r-backports/stretch/r-base-3.5.0=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -Wno-ignored-attributes -Wall call_function.cpp -Wl,--export-dynamic -fopenmp -Wl,-z,relro -L/usr/lib/R/lib -lR -lpcre -llzma -lbz2 -lz -lrt -ldl -lm -licuuc -licui18n -lblas -llapack -L/usr/local/lib/R/site-library/RInside/lib -lRInside -Wl,-rpath,/usr/local/lib/R/site-library/RInside/lib -o call_function
Running call_function:
3.57
3.57