Я больше всего знаком с этой проблемой в контексте Rcpp
, создав пакет.В случае, если вы представите в оригинальном сообщении, как указал Ральф Стубнер , это на самом деле не нужно;после замены скобок (<>
) вокруг f.h
в g.cpp
на кавычки (""
) ваш код отлично скомпилирован для меня с помощью sourceCpp()
:
Rcpp::sourceCpp("g.cpp")
g(1:10)
# [1] 2 4 6 8 10 12 14 16 18 20
(подробности см. в разделе1.10 виньетки Rcpp Attributes ).
Однако, если вам в конечном итоге понадобится несколько файлов .cpp
для компиляции (т. Е. Не только один, который зависит от реализации в другом),путь к созданию пакета.Это может показаться запутанным или пугающим, но с инструментами, предоставляемыми Rcpp
, это действительно довольно просто.Вот шаги, которые я предпринял, чтобы превратить ваш код в пакет:
- Из R, запустите
Rcpp::Rcpp.package.skeleton("SOanswer", example_code = FALSE)
- Удалите файл
Read-and-delte-me
. - Добавитьфайлы C ++ из исходного поста в папку
src/
(с одним незначительным редактированием - смена скобок (<>
) вокруг f.h
в g.cpp
на кавычки (""
)). - Из R, запустите
Rcpp::compileAttributes("SOanswer/")
и devtools::install("SOanswer/")
Затем он должен скомпилироваться и вы сможете запустить g()
из R:
SOanswer::g(1:10)
# [1] 2 4 6 8 10 12 14 16 18 20
Я скажу, чтоЯ бы добавил туда шаг 0: прочитайте виньетки по адресу https://cran.r -project.org / package = Rcpp , в частности виньетки Rcpp Введение и Rcpp Package.Вы также можете проверить этот прекрасный пример пакета с заголовками в src/
, предоставленного coatless в комментариях.