У меня есть программа, написанная на C ++, которая вычисляет значения для функции правдоподобия, которая опирается на большое количество данных. Я хочу иметь возможность вызывать функцию из R для запроса значений функции (вычисления в R занимают много времени, а программа на C ++ уже слишком долго, чтобы изменить ее, это примерно 150 тыс. Строк кода).
Я могу сделать это, чтобы запросить одно значение, но затем приложение C ++ завершается, и я должен перезапустить его и загрузить все данные снова (сделал это с .c()
). Загрузка занимает от 10-30 секунд, в зависимости от модели для функции правдоподобия и данных, и я подумал, есть ли способ сохранить приложение C ++ живым, ожидая запросов на значения функции, поэтому у меня нет прочитать все данные обратно в память. Уже вычисление одного значения функции в приложении C ++ занимает около полсекунды, что очень долго для C ++.
Я думал об использовании pipe()
сделать это, и спросить вас, является ли это возможным вариантом или я должен использовать какой-то другой метод? Возможно ли это сделать с помощью rcpp?
Я делаю это, чтобы проверить алгоритмы минимизации R для этой функции.
Забудь о .C
, Это неуклюже. Возможно используя .C
над .Call
или же .External
имел смысл до Rcpp. Но теперь с работой, которую мы вложили в Rcpp
Я действительно не вижу смысла в использовании .C
больше. Просто используйте .Call
,
Еще лучше с атрибутами (sourceCpp
а также compileAttributes
), вам даже не нужно видеть .Call
больше похоже на то, что вы используете функцию c ++.
Теперь, если бы я хотел сделать что-то, что сохраняет состояния, я бы использовал модуль. Например, ваше приложение это Test
учебный класс. У него есть методы do_something
а также do_something_else
и он подсчитывает, сколько раз эти методы используются:
#include <Rcpp.h>
using namespace Rcpp ;
class Test {
public:
Test(): count(0){}
void do_something(){
// do whatever
count++ ;
}
void do_something_else(){
// do whatever
count++ ;
}
int get_count(){
return count ;
}
private:
int count ;
} ;
Пока это довольно стандартный C ++. Теперь, чтобы сделать это доступным для R, вы создаете такой модуль:
RCPP_MODULE(test){
class_<Test>( "Test" )
.constructor()
.method( "do_something", &Test::do_something )
.method( "do_something_else", &Test::do_something_else )
.property( "count", &Test::get_count )
;
}
И тогда вы можете просто использовать его:
app <- new( Test )
app$count
app$do_something()
app$do_something()
app$do_something_else()
app$count
Здесь есть несколько вопросов.
Каков наилучший способ вызова кода C ++ из R?
Как отмечали другие комментаторы, Rcpp
Пакет обеспечивает лучший интерфейс. С использованием .Call
функция из базы R также возможна, но не рекомендуемые так хорошо, как Rcpp.
Как мне остановить многократную передачу данных между R и C ++?
Вы просто немного реструктурируете свой код. Перепишите подпрограмму-оболочку в C ++, которая вызывает все существующие подпрограммы C ++, и вызывайте ее из R.