2015-03-13 4 views
1

Я хотел бы написать функцию C++ с Rcpp, которая использует функциюC найдено в пакете hypred, который находится на CRAN here.Rcpp: Вызов функции C из пакета в Rcpp

Я читал using C function from other package in Rcpp, но не понимаю, применимо ли это для меня, и если это применимо, что делать.

Желаемая функция находится в исходном файле /src/hypredRoutines.c и называется meiosisFUNAllChr.

То, что я до сих пор так и на основе этого SO вопроса here является:

  1. Я отделил функцию meiosisFUNAllChr от остальной части коды и поместил его в новом файле с именем meiosisFUNAllChr.c.
  2. Я создал файл заголовка с именем meiosisFUNAllChr.h содержащий:

    #ifndef MEIOSISFUNALLCHR_H 
    #define MEIOSISFUNALLCHR_H 
    void meiosisFUNallChr (...); 
    #endif 
    
  3. Составитель его

    gcc -c -o meiosisFUNAllChr.o meiosisFUNAllChr.c 
    
  4. Создано фиктивной Си ++

    #include <Rcpp.h> 
    using namespace Rcpp; 
    
    extern "C" { 
    #include "meiosisFUNallChr.h" 
    } 
    
    // [[Rcpp::export]] 
    int timesTwo(int x) { 
    return x * 2; 
    } 
    

На этом этапе компиляция с sourceCpp не работает. Можете ли вы показать мне, как заставить его работать?

Большое спасибо!

EDIT

Компиляция с sourceCpp дает мне:

meiosisFUNallChr.h: file or directory not found 
+0

Я не эксперт в Rcpp, но я нашел RStudio очень полезным, так как он предоставляет шаблоны для него. Когда вы создаете проект, вы можете указать, что он использует Rcpp, и это упрощает многое. –

+0

Я знаю эти возможности и уже использовал их, но я не знаю, как это поможет мне получить функцию C, работающую в моем коде :-) – NoBackingDown

+0

вы пытались использовать 'sourceCpp'? –

ответ

-1

Кратко:

  • Вы хотите использовать другой исходный файл (предположительно доступный при подходящей лицензии).

  • Вы хотите назвать это из своего нового файла.

  • У вас уже есть два файла.

В настоящее время колокола тревоги должен погаснуть, что вы действительно, действительно, хотите создать пакет.

Какая информация о документации Rcpp находится в many мест. И есть еще 340 пакетов на CRAN с использованием Rcpp, многие из которых делают эту проблему с вызовом C-файла.Выберите один или два, изучите их структуру; также выберите один или два, созданные полностью задокументированными инструментами Rcpp, такими как Rcpp.package.skeleton(), и все должно стать намного яснее.

Редактировать: Очевидно, что этот подход требуется только в том случае, если другой пакет не экспортирует свою функцию. Если вы можете получить его автора для экспорта, используйте это как упоминание в ответе Ромен. Пары пакетов, экспорт/использование являются зоопарк/XTS, XTS/RcppXts, expm/RcppKalman (не на CRAN), RApiSerialize/RcppRedis, ...

+0

Спасибо, Дирк, я сделаю то, что ты предложил. – NoBackingDown

1

hypred регистрирует свои две функции, на уровне R вы можете разживаться от одного вы хотите, как это:

xp <- getDLLRegisteredRoutines(getLoadedDLLs()[["hypred"]])[[".C"]][["meiosisFUNallChr"]]$address 

Я считаю, то вы можете получить доступ к указателю на функцию в C++, как это:

DL_FUNC meiosisFUNallChr = reinterpret_cast<DL_FUNC>(R_ExternalPtrAddr(xp)) ; 

Но вы бы лучше вести переговоры с авторами пакета, что они внесите this scheme, если вы можете сделать случай, необходимо вызвать функцию C напрямую.

+0

+1 относительно схемы регистрации - есть несколько пакетов в вселенной Rcpp, которые делают это. Моим самым простым является, вероятно, RApiSerialize. @romain: это «getDLLRegisteredRoutine (...)» подход «благословен» (или, по крайней мере, терпимый) CRAN, то есть это то, что вы использовали для mlxR? –

+0

не знаю. Я не понимаю, почему нет, хотя, я только позволю разрешенные функции R 'getDLLRegisteredRoutines' и' getLoadedDLLs' ... 'mlxR' - совершенно другая птица –

+0

Да, совсем другая птица - не библиотека под R. Есть что-то, что отделяет вас от того, что вы сделали? У нас может быть аналогичная проблема с Rblpapi. –