Использование сторонних заголовочных файлов с Rcpp
У меня есть файл заголовкаcoolStuff.h
которая содержит функциюawesomeSauce(arg1)
что я хотел бы использовать в моем исходном файле cpp.
Структура каталогов:
RworkingDirectorysourceCpptheCppFile.cppcppHeaderscoolStuff.hКод:
#include <Rcpp.h>
#include <cppHeaders/coolStuff.h>
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 <boost/array.hpp>
(Это из Хэдли / 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.
Не забудьте "Build & Reload", если используете 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 <Rcpp.h>
, Обратите внимание, что вокруг ranker.h нет скобок, скорее есть "". Это соглашение C ++ при включении локальных файлов, предоставляемых пользователем, а не библиотечного файла, такого как Rcpp или STL и т. Д.
G) Теперь вам нужно пересобрать пакет. В RStudio это просто «Build & Reload» в меню Build. Если вы не используете RStudio, вы должны запуститьcompileAttributes()
H) Теперь попробуйте снова функцию R, как вы делали на шаге D), надеюсь, она сработает.