Для достижения того, что вы хотите, я бы использовал лямбда-функции c ++ 11 и вместо создания eq
в качестве функции я определил бы ее как функцию второго порядка: функцию, которая возвращает другую функцию, аргумент которой может быть theta
ты упомянул.Например:
...
Rcpp::NumericMatrix my_fun(const Rcpp::NumericVector vs, const float theta) {
state_type x = nvec_to_boost_array(vs); // initial conditions
integrate_const(make_dense_output( 1E-4 , 1E-4 , stepper_type () ) ,
eq(theta) , x , 0.0 , 120.0 , 1.0 , write_cout);
...
}
, а затем измененный eq
будет выглядеть примерно так:
std::function<void(const state_type, state_type, const double)> eq(const float theta) {
return [&theta](const state_type &x, state_type &dxdt, const double t) {
// do something with theta here
// for instance, modify nvec
...
// then your old function body
boost_array_to_nvec2(x, nvec);
my_fun22(nvec,t);
nvec_to_boost_array2(nvec, dxdt);
}
}
Таким образом, вы можете передавать параметры во время выполнения.Я не проверял это, но идея должна быть хорошей, я думаю.
Чтобы использовать функции c ++ 11, вам нужно убедиться, что вы установили компилятор c ++ в системный путь, который может компилировать код c ++ 11 иотредактируйте файл Makevars
в вашем R-проекте и добавьте сверху:
PKG_CXXFLAGS = -g -O3 -std=c++11
Подробнее об этом здесь , например.