Связь между R и переполнением стека

У меня есть программа, написанная на C ++, которая вычисляет значения для функции правдоподобия, которая опирается на большое количество данных. Я хочу иметь возможность вызывать функцию из R для запроса значений функции (вычисления в R занимают много времени, а программа на C ++ уже слишком долго, чтобы изменить ее, это примерно 150 тыс. Строк кода).

Я могу сделать это, чтобы запросить одно значение, но затем приложение C ++ завершается, и я должен перезапустить его и загрузить все данные снова (сделал это с .c()). Загрузка занимает от 10-30 секунд, в зависимости от модели для функции правдоподобия и данных, и я подумал, есть ли способ сохранить приложение C ++ живым, ожидая запросов на значения функции, поэтому у меня нет прочитать все данные обратно в память. Уже вычисление одного значения функции в приложении C ++ занимает около полсекунды, что очень долго для C ++.

Я думал об использовании pipe() сделать это, и спросить вас, является ли это возможным вариантом или я должен использовать какой-то другой метод? Возможно ли это сделать с помощью rcpp?

Я делаю это, чтобы проверить алгоритмы минимизации R для этой функции.

4

Решение

Забудь о .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
7

Другие решения

Здесь есть несколько вопросов.

Каков наилучший способ вызова кода C ++ из R?

Как отмечали другие комментаторы, Rcpp Пакет обеспечивает лучший интерфейс. С использованием .Call функция из базы R также возможна, но не рекомендуемые так хорошо, как Rcpp.

Как мне остановить многократную передачу данных между R и C ++?

Вы просто немного реструктурируете свой код. Перепишите подпрограмму-оболочку в C ++, которая вызывает все существующие подпрограммы C ++, и вызывайте ее из R.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector