Впервые в C ++, я хотел бы сделать функции, скомпилированные в DLL, доступными в R.
До сих пор мне удавалось сделать это для базовой функции, взяв integer
в качестве ввода и вернув ее, выполнив эти шаги в VisualStudio, а затем используя dyn.load
из R для загрузки созданного длл.
Однако мои функции C ++ должны будут обрабатывать объекты R data.frame
, и я не уверен, как это сделать. Из галереи Rcpp я видел, что Rcpp
может включать какие-то переводы между типами данных R и c ++, включая объекты data.frame
, но я не знаю, смогу ли я сгенерировать dll, используя Rcpp
что я могу затем включить в R, используя dyn.load
.
Из этого ответа Дирка Эддельбюттеля представляется возможным создать «динамическую библиотеку» с использованием Rcpp
, однако я не смог найти dll, когда попытался сгенерировать пакет с источником .cpp
файл с использованием rcpp.package.skeleton()
. Функция, для которой я хотел бы получить dll, взята из галереи Rcpp
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
DataFrame modifyDataFrame(DataFrame df) {
// access the columns
IntegerVector a = df["a"];
CharacterVector b = df["b"];
// make some changes
a[2] = 42;
b[1] = "foo";
// return a new data frame
return DataFrame::create(_["a"]= a, _["b"]= b);
}
Я попытался просто вставить этот код в VisualStudio, чтобы попытаться сгенерировать эту DLL, однако у меня появляется ошибка «не удается найти Rcpp.h», которую я вполне ожидал.
Затем я выполнил следующие шаги в RStudio:
- Создать новый проект / Пакет
- Включить этот исходный файл cpp в качестве исходного файла для этого пакета
include
Rcpp и введите Rcpp.package.skeleton("mypackage")
пока нет DLL в папках пакета
- Попытался собрать пакет в RStudio, перейдя в Build / Install и Restart, но затем я получаю сообщение об ошибке «Сборка R Packages требует установки дополнительных инструментов сборки, вы хотите их установить?» Однако у меня уже установлен RbuildTools 3.4, и когда я нажимаю «ДА» в RStudio, ничего не происходит.
PS: Рад слышать о других методах, но здесь следует использовать формат DLL, если это возможно. Любая информация очень ценится, так как я понятия не имею, как работают Rcpp или C ++