Загрузить ошибку при вызове файла Rcpp из R, а затем перезвонить в него

Я написал программу R, которая вызывает hello1(), функцию Rcpp, содержащуюся в программе demo2.cpp.

library(Rcpp)
ssss <- function(dd)
{
    return(paste("hello ",dd))
}

sourceCpp(file='demo2.cpp')
currentpath <- "/home/xuyan/R/parallel/"
aaa <-hello1(0,currentpath)
print(aaa)

my demo2.cpp is :

#include <Rcpp.h>
#include <string>
#include <RInside.h>

using namespace std;
using namespace Rcpp;

// [[Rcpp::export]]
int  hello1(int argc,string path)
{
    const char *argv[] = {path.c_str()};
    RInside R(argc,argv);
    R["txt"] = "Hello, world!\n";     

    R["sourcer"] = "demo.r";
    R.parseEvalQ("source(sourcer)");
    string str = Rcpp::as<string>(R.parseEval("ssss(txt)"));
    cout << "result is" << str << endl;
    return(111);
}

Я попытался запустить этот скрипт с помощью:

Rscript demo.r

Я получаю следующую ошибку:

Ошибка в dyn.load("/tmp/RtmpZl0JKp/sourceCpp-x86_64-pc-linux-gnu-0.12.10/sourcecpp_90cc33eafd15/sourceCpp_2.so"): невозможно загрузить общий объект '/tmp/RtmpZl0JKp/sourceCpp-x86_64-pc -linux-gnu-0.12.10/sourcecpp_90cc33eafd15/sourceCpp_2.so': /tmp/RtmpZl0JKp/sourceCpp-x86_64-pc-linux-gnu-0.12.10/sourcecpp_90cc33eafd15/sourceCpp_2.so: неопределенный символ: _ZN7RInsideD1Ev Вызовы: sourceCpp -> source -> withVisible -> eval -> eval -> dyn.load Выполнение остановлено

На самом деле, я хочу решить проблему медленности цикла for R. У меня есть программа R с большим циклом for, которая выполняется очень медленно. Итак, я хочу изменить этот цикл for с кода R на код C++. В цикле for я вызываю множество функций R. Итак, мне нужно вызвать из кода C++ программу R. Таким образом, порядок от R до C++ до R, то есть от R до Rcpp в Rinside, я ошибаюсь?

Почему?


person xuyan    schedule 05.04.2017    source источник


Ответы (1)


Вам не следует не создавать новый сеанс R из C++, если у вас уже есть активный сеанс R. При этом не НЕ включайте как Rcpp.h, так и RInside.h. В этом случае вы должны использовать только Rcpp.h.

Итак, просто используйте:

#include <Rcpp.h>

// [[Rcpp::export]]
int  hello1(int argc, string path)
{
    const char *argv[] = {path.c_str()};
    return(111);
}

Изменить 1

Согласно более позднему комментарию, который был удален, я думаю, вы хотите использовать некоторую функцию R в C++. Для этого используйте класс Function в Rcpp. Обязательно сначала загрузите функцию R в память, выполнив объявление. После этого скомпилируйте следующий код C++:

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::CharacterVector hello1()
{
    Rcpp::Function some_r_func("ssss");

    return some_r_func("a");
}

Окончательное редактирование

На самом деле, я хочу решить медлительность цикла R for. У меня есть программа R с большим циклом for, и она выполняется очень медленно. Итак, я хочу изменить цикл for с кода R на код C++. В цикле for я вызываю множество функций R. Итак, мне нужно позвонить из кода C++ в программу R. Таким образом, порядок от R до C++ до R, то есть от R до Rcpp до Rinside, я ошибаюсь?

Проблема с простым переключением цикла, который вызывает функции R с R на C++ и ожиданием ускорения, неверна. Затем один и тот же цикл должен обращаться каждый раз, когда он сталкивается с функцией R, и обмениваться данными с сеансом R. По сути, он эффективно приостанавливает код C++, ожидает выполнения кода R и результата, а затем возобновляет работу оболочки C++.

Единственный способ эффективно ускорить код в этой парадигме — полностью написать все функции R на C++, а затем вызвать их Эквиваленты C++ в цикле C++ for.

См. мои предыдущие замечания для «R to Rcpp to Rinside», что снова НЕТ. Никогда не делайте этого. Период. Жизнеспособны только «R to Rcpp» или «C++ to RInside».

person coatless    schedule 05.04.2017
comment
Если бы я мог проголосовать за это дюжину раз, я бы это сделал, обещаю! - person Dirk Eddelbuettel; 05.04.2017