Использование сторонних заголовочных файлов с Rcpp

У меня есть файл заголовкаcoolStuff.h которая содержит функциюawesomeSauce(arg1) что я хотел бы использовать в моем исходном файле cpp.

Структура каталогов:

RworkingDirectorysourceCpptheCppFile.cppcppHeaderscoolStuff.h

Код:

#include 
#include 
using namespace Rcpp;

// [[Rcpp::export]]
double someFunctionCpp(double someInput){

 double someOutput = awesomeSauce(someInput);

return someOutput;
}

Я получаю ошибку:

 theCppFile.cpp:2:31: error: cppHeaders/coolStuff.h: No such file or directory

Я переместил файл и каталог повсюду и могуКажется, это работает. Я вижу примеры повсеместного использования сторонних заголовков, которые говорят просто сделать это:

#include 

(Это из Хэдли / devtools)

https://github.com/hadley/devtools/wiki/Rcpp

Так что же дает? Я искал все утро и могуне могу найти ответ на то, что мне кажется простым делом.

ОБНОВЛЕНИЕ 01.11.12

Хорошо, теперь, когда я понял, как создавать пакеты, которые используют Rcpp в Rstudio, позвольте мне перефразировать вопрос. У меня есть отдельный заголовочный файл coolStuff.h, который содержит функцию, которую я хочу использовать в своем коде cpp.

1) Где я должен поместить файл coolStuff.h в структуру каталогов пакета, чтобы содержащаяся в нем функция могла использоваться в CppFile.cpp?

2) Как мне вызвать coolStuff.h в файлах cpp? В очередной раз благодарим за помощь. Я многому научился из последнего разговора.

Примечание: я читаю виньеткаНаписание пакета, который использует Rcpp " и это не объясняет, как это сделать.

Ответ:

Хорошо, позвольте мне обобщить ответ на мой вопрос, так как он разбросан по всей этой странице. Если я ошибаюсь в деталях, не стесняйтесь редактировать это или дайте мне знать, и я отредактирую это:

Итак, вы нашли.h или же.cpp файл, который содержит функцию или другой фрагмент кода, который вы хотите использовать в.cpp файл, который вы пишете для использования.Rcpp

Давайте продолжать называть этот найденный кодcoolStuff.h и вызвать функцию, которую вы хотите использоватьawesomeSauce(), Позволяет вызвать файл, который вы пишете.theCppFile.cpp

(Здесь следует отметить, что код в файлах .h и в файлах .cpp - это весь код C ++, и разница между ними заключается в том, чтобы программист C ++ организовывал вещи должным образом. Я оставлю обсуждение различий здесь , но простой поиск здесь на SO приведет вас к обсуждению разницы. Для вас программист R должен использовать немного о ' Код, который вы нашли, нет никакой разницы.)

КОРОЧЕ: Вы можете использовать файл какcoolStuff.h при условии, что он не вызывает никаких других библиотек, либо вырезать и вставить вtheCppFile.cppили, если вы создаете пакет, вы можете поместить файл в\src каталог сtheCppFile.cpp файл и использование#include "coolStuff.h" в верхней части файла, который вы пишете. Последний является более гибким и позволяет использовать функции вcoolStuff.h в других.cpp файлы.

ПОДРОБНОСТИ:

1)coolStuff.h не должны вызывать другие библиотеки. Таким образом, это означает, что в верхней части не может быть никаких операторов включения. Если это произойдет, то, что я подробно опишу ниже, вероятно, не будет работать, и использование найденного кода, который вызывает другие библиотеки, выходит за рамки этого ответа.

2) Если вы хотите скомпилировать файл сsourceCpp() вам нужно вырезать и вставлятьcoolStuff.h вtheCppFile.cpp, Мне говорят, что есть исключения, ноsourceCpp() предназначен для компиляции одного.cpp файл, так что это лучший путь.

(ПРИМЕЧАНИЕ. Я не даю никаких гарантий, что простое вырезание и вставка будут работать «из коробки». Возможно, вам придется переименовать переменные или, скорее, переключить используемые типы данных, чтобы они соответствовали тем, которые вы используете вtheCppFile.cpp, Но до сих пор, вырезать и вставить работал с минимальной суетой для меня с 6 различными простыми.h файлы)

3) Если вам нужно только использовать код изcoolStuff.h вtheCppFile.cpp и больше нигде, тогда вы должны вырезать и вставить его в.theCppFile.cpp

(Опять же, я не даю никаких гарантий, см. Примечание выше о вырезке и вставке)

4) Если вы хотите использовать код, содержащийся вcoolStuff.h вtheCppFile.cpp И другие.cpp файлы, вы должны посмотреть на создание пакета. Это не сложно, но может быть немного сложнее, потому что информация о сборке пакетов с помощью Rcpp варьируется от исчерпывающей исчерпывающей документации, которую вы хотите получить для любого пакета R (но это выше вашего понимания как новичка), и новичка, чувствительного к этому. введения (которые могут опустить деталивы бывает нужно).

Вот что я предлагаю:

А) Сначала получите версиюtheCppFile.cpp с кодом изcoolStuff.h вырезать и вставлять вtheCppFile.cpp который компилируется сsourceCpp() и работает так, как вы ожидаете. Это не обязательно, но если вы новичок в пакетах Rcpp OR, неплохо убедиться, что ваш код работает в этой простой ситуации, прежде чем переходить к более сложному случаю ниже.

Б) Теперь соберите свой пакет, используяRcpp.package.skeleton() или используйте функциональность Build в RStudio (НАСТОЯТЕЛЬНО рекомендуется). Вы можете найти подробную информацию об использованииRcpp.package.skeleton() вHadley / DevTools или жеRcpp атрибуты виньетка, Полная документация для написания пакетов с Rcpp находится вНаписание пакета, который использует RcppОднако этот предполагает, что вы достаточно хорошо разбираетесь в C ++, и не пользуетесь новым "Атрибуты» способ сделать Rcpp.

Дон»не забудь "Построить & Обновить» при использовании RStudio илиcompileAttributes() если вы не в RStudio.

C) Теперь вы должны увидеть в вашем каталоге \ R файл с именемRcppExports.R, Откройте это и проверьте это. ВRcppExports.R Вы должны увидеть функции оболочки R для всех файлов .cpp, которые есть в вашем\src каталог. Довольно мило.

D) Попробуйте функцию R, которая соответствует функции, которую вы написали вtheCppFile.cpp, Это работает? Если так, то иди дальше.

E) С вашим пакетом вы можете двигатьсяcoolStuff.h вsrc папка с.theCppFile.cpp

F) Теперь вы можете удалить код вырезания и вставки изtheCppFile.cpp и на вершинеtheCppFile.cpp (и любой другой файл .cpp, в котором вы хотите использовать код из coolStuff.h)#include "coolStuff.h" сразу после#include , Обратите внимание, что вокруг ranker.h нет скобок, скорее есть "", Это соглашение C ++ при включении локальных файлов, предоставляемых пользователем, а не библиотечного файла, такого как Rcpp или STL и т. Д.

G) Теперь вам нужно пересобрать пакет. В RStudio это простоПостроить & Обновить» в меню сборки. Если вы не используете RStudio, вы должны запуститьcompileAttributes()

H) Теперь попробуйте снова функцию R, как вы делали на шаге D), надеюсь, она сработает.

Ответы на вопрос(7)

Ваш ответ на вопрос