Пользователь 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 для решения этой проблемы. Ниже приведен код, который я пытался использовать:

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 правильно для вашей системы (большинство путей уже будут правильными или близкими к правильным), а затем выполните следующее из строки cmd Windows:

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