Потребител Rcpp на машина с Windows с множество инсталации на g++

Опитвам се да разгледам използването на Rcpp с R. Използвам машина с Windows 7 и за съжаление инсталирах няколко различни компилатора за различни проекти (python...). Когато се опитах да изпълня предоставения пример в пакета Rcpp, получих грешка. Кодът, който опитах, беше следният:

CFib = cppFunction(
  'int fibonacci(const int x) {
        if (x == 0) return(0); 
        if (x == 1) return(1);
        return (fibonacci(x - 1)) + fibonacci(x - 2);
    }')

Това не успя със следното съобщение от конзолата:

g++ -m64 -I"C:/PROGRA~1/R/R-31~1.1/include" -DNDEBUG     -I"C:/Users/jclutter/Documents/R/win-library/3.1/Rcpp/include"  -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c file1c205fb26c00.cpp -o file1c205fb26c00.o
file1c205fb26c00.cpp:1:0: sorry, unimplemented: 64-bit mode not compiled in
 #include <Rcpp.h>
 ^
make: *** [file1c205fb26c00.o] Error 1
Warning message:
running command 'make -f "C:/PROGRA~1/R/R-31~1.1/etc/x64/Makeconf" -f "C:/PROGRA~1/R/R-31~1.1/share/make/winshlib.mk" SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)' SHLIB="sourceCpp_22135.dll" WIN=64 TCLBIN=64 OBJECTS="file1c205fb26c00.o"' had status 2 
Error in sourceCpp(code = code, env = env, rebuild = rebuild, showOutput = showOutput,  : 
  Error 1 occurred building shared library.

Осъзнавам, че това е така, защото най-вероятно използва компилатор, който не е имал компилиран 64-битов инча. Имам инсталиран Rtools версия 3.1, но не е част от моя път (не знам защо). Vice, вмъквайки още един компилатор в моя път, реших, че мога да използвам Rcpp Plugin, за да реша проблема. Следното е кодът, който се опитах да използвам:

rtoolsplug = Rcpp.plugin.maker(
  Makevars = 'CXX = c:/Rtools/gcc-4.6.3/bin/g++.exe',
  Makevars.win = 'CXX = c:/Rtools/gcc-4.6.3/bin/g++.exe'
)
registerPlugin('rtools', rtoolsplug)

CFib = cppFunction(
  'int fibonacci(const int x) {
        if (x == 0) return(0); 
        if (x == 1) return(1);
        return (fibonacci(x - 1)) + fibonacci(x - 2);
    }',
  plugins = c('rtools')
  )

Когато изпълня това, получавам следната грешка (спойлер, същото е):

g++ -m64 -I"C:/PROGRA~1/R/R-31~1.1/include" -DNDEBUG     -I"C:/Users/jclutter/Documents/R/win-library/3.1/Rcpp/include"  -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c file1c206a9e1cf1.cpp -o file1c206a9e1cf1.o
file1c206a9e1cf1.cpp:1:0: sorry, unimplemented: 64-bit mode not compiled in
 #include <Rcpp.h>
 ^
make: *** [file1c206a9e1cf1.o] Error 1
Warning message:
running command 'make -f "C:/PROGRA~1/R/R-31~1.1/etc/x64/Makeconf" -f "C:/PROGRA~1/R/R-31~1.1/share/make/winshlib.mk" SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)' SHLIB="sourceCpp_94004.dll" WIN=64 TCLBIN=64 OBJECTS="file1c206a9e1cf1.o"' had status 2 
Error in sourceCpp(code = code, env = env, rebuild = rebuild, showOutput = showOutput,  : 
  Error 1 occurred building shared library.

Мислех, че със сигурност ще мога да поправя това с плъгин. Опитвам ли се да направя това неправилно?

За пълнота тук са версиите на моя софтуер:

  • Windows 7
  • R: 3.1.1
  • Rtools: 3.1 (Не е в пътя по някаква причина)
  • Rcpp: 0.11.2

person Justace Clutter    schedule 24.08.2014    source източник
comment
Прочетете много внимателно ръководствата за Писане на R разширения и R инсталация и администриране и задайте пътя си правилно. Всъщност няма нищо повече от това: имате нужда от подходящите инструменти, правилно настроени и с правилния път за Rtools и неговия g++ компилатор.   -  person Dirk Eddelbuettel    schedule 24.08.2014
comment
Добре, разбирам, че ако искам Rcpp да работи извън кутията, трябва да направя тези неща... Грешно ли съм, като си мисля, че съм твърд код, който компилаторът да използва чрез метода на добавките?   -  person Justace Clutter    schedule 24.08.2014
comment
Вече казах, че няма нищо общо. Настройте инструментите и Rcpp работи веднага. Ако настоявате да го направите по различен начин и то се счупи, можете да запазите парчетата.   -  person Dirk Eddelbuettel    schedule 24.08.2014
comment
хаха... Просто мразя идеята да променям пътя си всеки път, когато превключа към различни инструменти. Добре, като се има предвид всичко това, можете ли да ми кажете защо Makevars не се почита в горния код?   -  person Justace Clutter    schedule 24.08.2014
comment
За този конкретен случай можете да го автоматизирате, като имате някакъв код във вашия ~/.Rprofile, който автоматично задава подходящите променливи на средата при стартиране на R сесия (ако приемем, че се интересувате главно от това да работи в R)   -  person Kevin Ushey    schedule 24.08.2014


Отговори (2)


Редактирайте този пакетен файл https://batchfiles.googlecode.com/svn/trunk/Rpathset.bat, за да бъде правилен за вашата система (повечето пътеки вече ще бъдат правилни или почти правилни) и след това изпълнете следното от Windows cmd реда:

Rpathset.bat
Rgui

Това временно ще зададе подходящия път и ще изпълни R. Имайте предвид, че никакви настройки на вашата система няма да бъдат променени за постоянно. Това е само временно за текущата сесия на cmd линия.

Забележка: Rpathset.bat е част от дистрибуцията на пакетни файлове, но нямате нужда от други файлове от него, ако всичко, което искате да направите, е горното. Начална страница: https://batchfiles.googlecode.com

person G. Grothendieck    schedule 24.08.2014
comment
Благодаря за този отговор, но бих искал да намеря нещо, което е по-близко до коригиране на средата за изграждане, без да е необходимо да променяте глобалната инсталация и необходимостта да изпълните скрипт преди стартирането на R. В крайна сметка направих нещо подобно, което ще публикувам като отговор по-долу. - person Justace Clutter; 25.08.2014
comment
Това не е съвсем правилно. Всъщност това не води до глобални промени. Той променя само текущата конзолна сесия. Други конзолни сесии на същата машина по същото време не са засегнати и изобщо не се правят постоянни промени. - person G. Grothendieck; 25.08.2014

Поправих проблема, като прочетох внимателно ръководството за инсталиране на R и внедрих базиран на локален потребител файл Makevars.win. Файлът Makevars.win е специален make-файл, който се изтегля в другите вътрешни make-файлове, които R използва за компилации. Във файла Makevars.win можете да нулирате или актуализирате променливи на Makefile, които са от значение за процеса на изграждане. Файлът Makevars.win, който използвах, е следният:

PATH := c:/Rtools/bin;C:/Rtools/gcc-4.6.3/bin;$(PATH)
CXX  = c:/Rtools/gcc-4.6.3/bin/g++.exe -m64

Не съм сигурен дали направих това напълно правилно и не го гледам намръщено, тъй като има твърдо кодирани стойности. Иска ми се да има начин да кажа на R да използва Rtools като инструменти за изграждане по подразбиране и след това да използва само локално инсталирани инструменти, когато е специално поискано.

Специално внимание заслужава местоположението на файла Makevars.win. Ръководството посочва, че трябва да бъде поставено в домашната директория на потребителите под директория, наречена .R. Ръководството трябва да се актуализира, за да се подчертае, че началната директория не е същата като %USERPROFILE% или друга често дефинирана променлива на средата. Домашната директория на потребителите, в смисъл на R, може да бъде намерена чрез изпълнение на командата show.file('~'). В моя случай това беше:

c:\Users\<MYNAME>\Documents\.R\Makevars.win

Надявам се, че това ще помогне на други хора да използват Makevars.win в бъдеще.

Използвайки тази настройка, аз успях да използвам горния Rcpp код без елементите на приставката. Мисля, че има известно объркване по отношение на системата за плъгини за Rcpp. Въз основа на това, което прочетох, трябва да работи по начина, по който се опитах да го използвам. Ще проуча това в бъдеще. Мисля, че би било различен чист начин да коригирате тези настройки според нуждите в движение. Нещо, което търсих от самото начало.

person Justace Clutter    schedule 25.08.2014