Настройка Rcpp Armadillo в Windows с помощью Rstudio

Я пытаюсь настроить RcppArmadillo в своей системе Windows с помощью Rstudio. Я успешно установил RcppArmadillo с помощью команды

install.packages("RcppArmadillo")

в консоли Р.

Но когда я пытаюсь скомпилировать код С++ с зависимостью RcppArmadillo, я получаю сообщение об ошибке, например

g++ -m64 -I"C:/PROGRA~1/R/R-30~1.3/include" -DNDEBUG     -I"C:/PROGRA~1/R/R-30~1.3/library/Rcpp/include"  -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c colrowStat.cpp -o colrowStat.o colrowStat.cpp:5:26: fatal error: RcppArmadillo.h: No such file or directory compilation terminated. make: *** [colrowStat.o] Error 1 Warning message: running command 'make -f "C:/PROGRA~1/R/R-30~1.3/etc/x64/Makeconf" -f "C:/PROGRA~1/R/R-30~1.3/share/make/winshlib.mk" SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)' SHLIB="sourceCpp_38187.dll" WIN=64 TCLBIN=64 OBJECTS="colrowStat.o"' had status 2 

Но заголовочные файлы доступны в path_to_my_documents/R/win-libraries/3.0/RcppArmadillo/Include.

Я думаю, что путь включения для компиляции не имеет этого пути. Я не знаю, как добавить эту папку в путь. Я очень ценю любую помощь с этой проблемой.


person gman    schedule 19.05.2014    source источник


Ответы (2)


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

Попробуйте это вместо этого и идите оттуда:

R> library(Rcpp)
R> cppFunction("arma::mat op(arma::vec x) { return(x*x.t()); }", 
+              depends="RcppArmadillo")
R> op(1:2)
     [,1] [,2]
[1,]    1    2
[2,]    2    4
R> 

Это один из основных примеров: взять вектор, умножить его на его транспонирование и вернуть результирующую матрицу внешнего произведения.

В конечном итоге вам нужен пакет, и для этого вы могли бы сделать гораздо хуже, чем начинать с RcppArmadillo.package.skeleton().

person Dirk Eddelbuettel    schedule 19.05.2014

В вашем вопросе мало деталей, но если вы работаете на компьютере с Windows и используете RStudio, то вот полностью воспроизводимый пример того, как использовать RcppArmadillo без использования пакета inline, который не идеален, за исключением очень коротких функций.
Как заметил Дирк, этот совет можно найти в другом месте — экосистема Rcpp* на удивление хорошо документирована, но это может помочь новичку.

0. Предварительные:

У вас должно быть установлено следующее:

  1. Rtools
  2. Пакет R инструменты разработчика
  3. Пакет R Rcpp
  4. Пакет R RcppArmadillo

1. Код С++:

Это простой пример вычисления оценки МНК для модели линейной регрессии. Вот как выглядит файл C++ с одной функцией (fnLinRegRcpp), которая принимает матрицы проектирования в качестве входных данных и производит оценки коэффициентов OLS и остатки модели в виде Rcpp List:

// LinearRegression.cpp
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace arma;  // use the Armadillo library for matrix computations
using namespace Rcpp;

// [[Rcpp::export]]
List fnLinRegRcpp(vec vY, mat mX) {

  // compute the OLS estimator & model residuals
  vec vBeta =  solve(mX.t()*mX, mX.t()*vY);  
  vec vResid = vY - mX * vBeta;

  // construct the return object
  List ret;
  ret["beta"] = vBeta;
  ret["resid"] = vResid;

  return ret;
}

// END

Обратите внимание на использование атрибутов Rcpp:

// [[Rcpp::depends(RcppArmadillo)]]

для указания зависимостей библиотеки от библиотеки Armadillo.

2. R-код

Вот пример компиляции кода C++ с использованием функции sourceCpp вместе с примером использования функции и сравнением вывода со встроенной функцией lm.fit.

# LinearRegression.R
library(devtools)
library(Rcpp)
library(RcppArmadillo)

Rcpp::sourceCpp("code/LinearRegression.cpp", 
                showOutput = TRUE, 
                rebuild = FALSE)

# generate some sample data
iK = 4
iN = 100
mX = cbind(1, matrix(rnorm(iK*iN), iN, iK))
vBeta0 = c(2, 3.5, 0.11, 6.33, 23)
vY = rnorm(iN, mean = mX %*% vBeta0)

# test the function
linReg1 = fnLinRegRcpp(vY, mX)
linReg1$beta  # coefficient estimates

# compare the results to the built-in lm.fit function
lm.fit(y = vY, x = mX)$coef  # coefficient estimates

# END
person tchakravarty    schedule 21.10.2014
comment
Ваш пример довольно ясен и хорош, и я хорошо запускаю его в своей Rstudio с помощью sourceCpp Однако, когда я хочу обернуть его как пакет, например, библиотеку (fnLinRegRcpp), следуя Rarmadillo, что-то не так, например <'vec' was not declared in this scope...>. Кажется, что каждый vec или mat в вашем файле LinearRegression.cpp должен быть чем-то вроде arma::vec или arma::mat, в то время как метод sourceCpp() не должен быть таким хлопотным. - person John Stone; 04.01.2020
comment
Кстати, я использую RcppArmadillo.package.skeleton("fnLinRegRcpp") для запуска, Файл -> Новый проект -> Существующий каталог, затем добавляю LinearRegression.cpp в каталог src. Он обнаруживает, что он отлично работает с sourceCpp() в библиотеке (RcppArmadillo) без каких-либо изменений вашего кода cpp, хотя кажется, что что-то должно быть изменено, если мы обернем его как пакет R. Я неправильно понимаю? @tchakravarty - person John Stone; 04.01.2020
comment
См. также примеры в разделах Как создавать пакеты Rcpp в Rstudio с помощью RcppArmadillo и Переход с sourceCpp на пакет с RcppArmadillo, и я успешно обернул rmvrnorm_arma2 и cholcalcCpp в пакет R, но не смог на вашем fnLinRegRcpp @tchakravarty - person John Stone; 04.01.2020