У меня есть файл заголовка с именем coolStuff.h
, который содержит функцию awesomeSauce(arg1)
, которую я хотел бы использовать в моем исходном файле cpp.
Структура каталога:
- RworkingDirectory
- sourceCpp
- theCppFile.cpp
- cppHeaders
- coolStuff.h
- sourceCpp
Код:
#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>
(Это от Hadley / 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
не должен вызывать другие библиотеки. Это означает, что вверху не может быть никаких операторов include. Если это так, то то, что я подробно описываю ниже, вероятно, не сработает, и использование найденного кода, который вызывает другие библиотеки, выходит за рамки этого ответа.
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 (но это выше вашей головы как новичка), и чувствительной к новичкам. знакомство (которое может упустить деталь, которая вам может понадобиться).
Вот что я предлагаю:
A) Сначала получите версию theCppFile.cpp
с кодом из coolStuff.h
вырезать и вставить в theCppFile.cpp
, который компилируется с sourceCpp()
и работает так, как вы ожидаете. Это не обязательно, но если вы новичок в пакетах Rcpp OR, было бы хорошо убедиться, что ваш код работает в этой простой ситуации, прежде чем переходить к более сложному случаю, описанному ниже.
Б) Теперь соберите свой пакет с помощью Rcpp.package.skeleton()
или используйте функцию сборки в 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 <Rcpp.h>
. Обратите внимание, что в строке ranker.h нет скобок, вместо этого есть "". Это соглашение C ++ при включении локальных файлов, предоставленных пользователем, а не файла библиотеки, такого как Rcpp или STL и т. Д.
G) Теперь вам нужно пересобрать пакет. В RStudio это просто «Сборка и перезагрузка» в меню «Сборка». Если вы не используете RStudio, запустите compileAttributes()
H) Теперь попробуйте функцию R еще раз, как вы делали на шаге D), надеюсь, она сработает.
#include "../cppHeaders/coolStuff.h"
#include <"../cppHeaders/coolStuff.h">
#include <../cppHeaders/coolStuff.h>
Еще:: No such file or directory
- person politicalEconomist   schedule 21.12.2012sourceCpp()
для компиляции файла и создания функции R, тогда простой #include path / filename.h не будет работать. Однако похоже, что если вы используетеRcpp.package.skeleton()
или аналогичный мастер создания пакетов в Rstudio, тогда при некоторых условиях будет работать простой #include path / filename.h. Как только я, наконец, разберусь со всем этим, я напишу сводку вызова другого кода в ваших файлах cpp с помощью Rcpp. - person politicalEconomist   schedule 11.01.2013