Установка пакетов Rcartogram - сообщение об ошибке

Я пытаюсь построить картограмму, как здесь

Установка по ссылке не работает:

`install.packages('Rcartogram', repos = 'http://www.omegahat.org/R', type = 'source')`
Installing package into ‘C:/Users/Milena/Documents/R/win-library/3.2’
(as `lib` is unspecified)

Warning in install.packages :
  package ‘Rcartogram’ is not available (for R version 3.2.0)

Ни из почтового файла:

install.packages("C:/Users/Milena/Downloads/Rcartogram_0.2-2.tar.gz", repos = NULL, type = "source")

Установка пакета в 'C:/Users/Milena/Documents/R/win-library/3.2' (как lib не указан) * установка исходного пакета Rcartogram... **********************************************
WARNING: this package has a configure script It probably needs manual configuration **********************************************

** libs

*** arch - i386 Предупреждение: выполняется команда 'make -f "Makevars" -f "C:/PROGRA~1/R/R-3.2.0/etc/i386/Makeconf" -f "C:/PROGRA~1/R/R-3.2.0/share/make/winshlib.mk" SHLIB="Rcartogram.dll" OBJECTS="Rcart.o cart.o"'имеет статус 127 ОШИБКА: не удалось выполнить компиляцию для пакета'Rcartogram' * Removal'C:/Users/Milena/Documents/R/win-library/3.2/Rcartogram'Предупреждение в install.packages: выполняется команда'"C:/PROGRA~1/R/R-3.2.0/bin/x64/R" CMD INSTALL -l "C:\Users\Milena\Documents\R\win-library\3.2" "C:/Users/Milena/Downloads/Rcartogram_0.2-2.tar.gz"'имеет статус 1 Предупреждение при установке. пакеты: установка пакета 'C: /Users/Milena/Downloads/Rcartogram_0.2-2.tar.gz' имела ненулевой статус выхода

Как я могу решить эту проблему?

Я работаю на машине Windows.

Спасибо всем, кто нашел время, чтобы найти этот вопрос.

Вот мой sessionInfo:

R version 3.2.0 (2015-04-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 8 x64 (build 9200)

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252    LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] fftw_1.0-3

loaded via a namespace (and not attached):
[1] tools_3.2.0

2 ответа

Решение

Установка Rcartogram в Windows

Rcartogram - это R-пакет (от Duncan Temple Lang), основной целью которого является предоставление R-оболочки для некоторого C-кода (написанного Марком Ньюманом), который фактически выполняет работу по созданию картограммы (иначе говоря, изменяя карту). Код C, написанный Марком Ньюманом, использует скомпилированную библиотеку FFTW (самое быстрое преобразование Фурье на Западе).

Ссылка в вашем вопросе от Truc Viet Le описывает, как установить Rcartogram в системе Unix. Есть несколько дополнительных уловок и ловушек, связанных с получением Rcartogram в систему Windows, хотя в своей основе это в значительной степени тот же процесс.

Чтобы установить Rcartogram в системе Windows, вам необходимо сначала установить все необходимые компоненты, а именно:

  • набор программ Rtools (который должен быть в состоянии установить любой пакет R, который включает в себя код C на компьютер с Windows), и
  • Библиотека FFTW (которую использует код Rcartogram).

Затем вам нужно указать R, где искать библиотеку FFTW, когда вы впервые устанавливаете Rcartogram, и вам почти наверняка понадобится сообщить R, где найти библиотеку FFTW при каждой загрузке Rcartogram, например, с помощью library(Rcartogram) в сеансе R.

Я обнаружил, что мне также нужно было внести несколько очень небольших изменений в код Rcartogram R (в основном, чтобы привести его в соответствие с изменениями в синтаксисе R с момента его написания), чтобы обеспечить его успешную установку и корректную работу в Windows.

Таким образом, полный ответ включает в себя несколько шагов.

Шаг 1: Установите пакет Rtools

Я подозреваю, что вам нужно установить Rtools, чтобы преодолеть ошибку статуса 127. Официальные инструкции о том, как это сделать, находятся здесь http://cran.r-project.org/doc/manuals/R-admin.html. Есть удобные объяснения того, как установить Rtools в систему Windows где-либо еще в Интернете - см., Например, https://github.com/stan-dev/rstan/wiki/Install-Rtools-for-Windows. (В официальных инструкциях рассказывается, как установить множество других вещей, которые вам понадобятся, если вы хотите собрать сам R из исходного кода в Windows или создать документацию по пакету с использованием LaTeX, но вам не нужны все эти вещи для получения Rcartogram за работой).

Немного дольше отвечу: теперь я могу копировать ваши status 127 error --- удалив ссылки на каталоги, где живет Rtools, из моего PATH. Когда я делаю это, оболочка Windows cmd (где вы могли бы ввести R CMD INSTALL … не удается найти исполняемые файлы Rtools, что приводит к сообщению об ошибке 127. Точно так же пытаюсь бежать install.packages() изнутри R тоже не получается так же, так как под капотом install.packages вызывает командную оболочку Windows.

Зачем тебе Rtools? Ну, Rcartogram - это пакет, который включает в себя C-код, а также чистый R-код. На самом деле это в основном C-код - от Марка Ньюмана. Для установки из исходного кода пакета, включающего код на C, требуется компилятор C. На самом деле лучше (почти необходимо), чтобы это был тот же компилятор C, из которого был построен сам R. Именно это в основном и представляет собой Rtools - устанавливаемая на Windows версия компилятора Си. Запуск компилятора C в Windows также требует нескольких дополнительных команд оболочки (также называемых небольшими программами), и это то же самое, что и остальная часть Rtools. Большинство сообщества C (с открытым исходным кодом), похоже, работают в мире Unix (или его варианта), и эти дополнительные команды (и, собственно, сам компилятор C) являются частью "стандартной" системы в Unix. Только те из нас, кто работает в Windows, должны установить Rtools, который является портом необходимых инструментов от Unix до Windows.

Шаг 2. Установите библиотеку FFTW.

Первоначально я получил библиотеку FFTW отсюда http://www.fftw.org/.

Существует две версии: 32-битная и 64-битная. На 64-битной машине с Windows вам нужны обе версии. (Кроме того, может быть, вы можете обойтись только одним, установив флажки при установке Rcartogram, но я сам пока не тестировал этот маршрут). Распакуйте 32-битную версию в подкаталог /i386 и 64-битная версия в подкаталог /x64, В моем случае (см. Ниже) я сделал их как подкаталоги в "C:/msys/fftwtest". (Помимо этих подкаталогов есть соглашения, которые использует R - теоретически вы можете поместить их в другом месте, но зачем делать дополнительные сложности!).

Одна ловушка, которая озадачила меня довольно долгое время, заключалась в том, что эти библиотеки являются динамическими библиотеками (то есть.dll), и поэтому - позже - мне нужно было убедиться, что когда я устанавливал их на свой компьютер, я помещал их в места, которые были на PATH (или, в качестве альтернативы, я изменил свой PATH, добавив в местоположения - то есть каталоги - где они были установлены), так как в противном случае я получил очень бесполезные сообщения об ошибках во время окончательных проверок, которые выполняет R до завершения установки пакета. Как 32-битные, так и 64-битные (под) каталоги должны быть включены в ваш PATH.

Шаг 3: Скажите R, где найти библиотеку FFTW

Хитрость в том, чтобы сообщить R (на компьютере с Windows), где найти библиотеки FFTW, когда он пытается установить Rcartogram, - добавить src/Makevars.win файл в подкаталог src пакета Rcartogram. Это означает, что вам придется распаковать и распаковать файл tar.zz Rcartogram, прежде чем вы сможете внести это изменение. (Помимо: я использую 7zip, чтобы распаковать файлы такого типа на моей машине).

Мой файл src/Makevars.win (это текстовый файл) имеет 2 строки,

PKG_CPPFLAGS=-I"C:\msys\fftwtest\x64\include"   -DNOPROGRESS 
PKG_LIBS=-L"C:\msys\fftwtest\x64\lib" -L"C:\msys\fftwtest\i386\lib" -lfftw3 -lm

Имена файлов в кавычках - это место, где я помещаю свои версии библиотеки FFTW. (Это не совсем те, которые я скачал, по ходу обучения я научился компилировать FFTW из исходного кода и сделал свои собственные копии, но объяснение, как это сделать, довольно сложная история, поэтому я не буду пытаться делать это здесь).

Каталог, упомянутый в строке PKG_CPPFLAGS, - это каталог, содержащий файл заголовка fftw3.h, в котором нуждается препроцессор Си. Неважно, указываете ли вы на 32-битный (подкаталог \i386) или на 64-битный (\x64 подкаталог) - файл fftw3.h является исходным файлом C и является тем же самым независимо от того, для чего устанавливается архитектура R.

2 директории, упомянутые в строке PKG_LIBS, - это те, где можно найти файлы с именем libfftw3.something и которые нужны компоновщику, когда он собирает все вместе в конце этапа компиляции. что-то может быть ".dll" (в этом случае подкаталог может быть \bin вместо \lib), или это может быть ".a" или ".la" (это то, что R ищет, когда использует статические библиотеки FFTW который я создал, как только я научился компилировать FFTW из исходного кода).

Требуются 2 каталога, поскольку R по умолчанию пытается установить 32-битную и 64-битную версии Rcartogram на компьютерах с Windows. Если вы предоставляете файлы библиотеки FFTW в формате.dll, то это точно те же библиотеки, которые должны быть в вашей переменной PATH (поскольку при попытке сделать библиотеку (Rcartogram) R необходимо снова найти библиотеки DLL FFTW во время загрузки установленной библиотеки). Пакет Rcartogram) (Кроме того, именно поэтому, в конце концов, я скомпилировал свои статические библиотеки FFTW, поэтому мне не пришлось связываться с моей переменной PATH в среде Windows).

Если вы используете загруженные двоичные файлы по ссылке выше, файлы fftw3.h и libfftw3.dll находятся в одном (под) каталоге, а файл libfftw3.dll фактически называется libfftw3-3.dll, поэтому в этом case ваш файл src/Makevars.win должен быть:

PKG_CPPFLAGS=-I"main libfftw directory\x64"   -DNOPROGRESS 
PKG_LIBS=-L"main libfftw directory\x64" -L"main libfftw directory\i386"  -lfftw3-3 -lm

Основные отличия от моего src/Makevars.win:

  • вставив название вашего main libfftw directory - т.е. родительский каталог, в котором вы создали /i386 а также /x64 подкаталоги, когда вы разархивировали загруженные двоичные файлы FFTW
  • удаление \include а также \lib подкаталоги и
  • изменения -libfftw3 в -libfftw3-3 (обратите внимание также, что перед каждым должно быть место - (минус) в начале -L а также -l флаги).

Что делает файл Makevars.win? Он сообщает процессу установки R флаги, которые ему понадобятся, когда он попытается выполнить предварительную обработку, скомпилировать и связать код C в подкаталоге Rcartogram src. Значение PKG_CPPFLAGS является набором флагов для препроцессора C, а значение PKG_LIBS это набор флагов для шага ссылки.

  • -I это флаг, который говорит "попробуйте поискать в следующем каталоге, когда препроцессор C ищет включаемые файлы", поэтому в приведенном выше примере он говорит: "main libfftw directory\x64", Включаемый файл, который он ищет, fftw3.h (это имя файла скрыто в коде C внутри Rcartogram)
  • -L флаг говорит "попробуйте поискать в следующем каталоге, когда компоновщик ищет файлы из любой библиотеки, которую вы ожидаете использовать", поэтому -L"main libfftw directory\x64" говорит, попробуйте заглянуть в "main libfftw directory\x64" каталог. Вы можете (и должны иметь) более одного каталога в этом пути поиска - компоновщик просто продолжает искать, пока не найдет то, что ищет (или не хватит мест для поиска и выдаст сообщение об ошибке), и
  • -l flags дает имя файла библиотеки, который должен искать компоновщик, но не дословно - вместо этого имя создается из того, что вы вводите в соответствии с (немного сумасшедшим для меня) соглашением из мира Unix. Поскольку имя файла библиотеки всегда начинается с "lib", первая часть соглашения состоит в том, что вы оставляете "lib" вне имени, которое вы указали в флаге. Имя файла библиотеки может иметь несколько различных расширений (например, ".dll" или ".a"), поэтому вторая часть соглашения заключается в том, что вы оставляете расширение файла за пределами -l значение флага, и позволить компоновщику разобраться, что он хочет. Так –lfftw3 говорит искать файл под названием либо libfftw3.dll или один называется libfftw3.a (могут быть и другие возможные расширения, я не уверен).

Загруженные библиотеки на самом деле называются libfftw3-3.dll, (в отличие от тех, что я сам собрал, которые называются libfftw3.a) отсюда необходимость менять –l флаг для –lfftw3-3

NB Если вы используете загруженную библиотеку FFTW, которая использует .dll s убедитесь, что вы поместили их в свой путь PATH (см. последний пункт шага 2).

Шаг 4: Небольшие исправления в коде Rcartogram C

Было два других небольших изменения, которые я должен был внести в сам код Rcartogram, чтобы все заработало.

Сначала в файле R/cart.R есть две строки, каждая из которых использует .Call( ) функция. Мне нужно было добавить еще один аргумент (а именно PACKAGE = "Rcartogram") к .Call функция, так, например,

tmp = .Call("R_makecartogram", popEls, x, y, dim, as.numeric(blur))

стал

tmp = .Call("R_makecartogram", popEls, x, y, dim, as.numeric(blur), PACKAGE = "Rcartogram")

Аналогично, дальше вниз по корзине. .Call стал

.Call("R_predict", object, as.numeric(x),  as.numeric(y), ans, dim(object$x), PACKAGE = "Rcartogram")

Во-вторых, снова в R / Cart.R, мне пришлось изменить

tmp = rep(as.numeric(NA), length(x))
ans = list(x = tmp, y = tmp)

в

# Avoid problems with the same vector (tmp) being sent to C twice due to R's
# copy-on-modify rules
tmp_x = rep(as.numeric(NA), length(x))
tmp_y = rep(as.numeric(NA), length(y))
ans = list(x = tmp_x, y = tmp_y)

Это заняло у меня много работы, но без нее демо для Rcartogram дало неверные результаты (хотя и работало нормально).

Шаг 5: Фактически установите Rcartogram

Теперь вы сможете установить Rcartogram. Или

  • открыв окно cmd, изменив каталог (cd к) место, где находится разархивированный и модифицированный исходный код пакета Rcartogram, и набрав R CMD INSTALL --preclean . или же

  • запустив сеанс R, установив рабочий каталог, где находится источник Rcartogram, и набрав install.packages(".", repos = NULL, type = 'source', INSTALL_opts = "--preclean")

. работает, потому что у вас есть cd Перейдите в каталог, где находится исходный код Rcartogram. --preclean flag указывает R привести в порядок все оставшиеся промежуточные файлы от предыдущих (неудачных) попыток скомпилировать код C в Rcartogram до его начала. Если вы зашли так далеко и все еще испытываете проблемы, есть также --debug флаг, который также может быть добавлен. Это дает более подробную информацию о том, почему происходит сбой установки.

Шаг 6: наслаждайтесь морфингом карт

Я только начал собственно использовать Rcartogram (мне потребовалось некоторое время, чтобы пройти этот путь!), Но вы можете попробовать пакет getcartr --- R. Этот пакет использует Rcartogram, и он выглядит довольно аккуратно! И инструкции по установке, приведенные на сайте github, сработали для меня впервые (у меня уже есть devtools, установленный и работающий, хотя).

Надеюсь, что это поможет (и поздравляю всех, кто прочитал это далеко)

Обновление май 2017

Я не работал над этим в течение нескольких лет (поэтому нет никаких гарантий, что он все еще будет работать), но после того, как я написал пост выше, я создал раздвоенную копию RCartogram на https://github.com/Geoff99/Rcartogram/tree/WindowsInstall.

Смотрите ветку WindowsInstall, которая включает в себя

(Для использования учебника вам необходимо использовать ветку WindowsInstall разветвленного хранилища!)

Чтобы установить Rcartogram, вам необходимо скачать пакет с сайта http://www.omegahat.org/Rcartogram/ и установить его из исходного кода. Откройте свой терминал (в Windows он называется командная строка), перейдите в каталог, в котором находится загруженный файл, и введите: R CMD INSTALL Rcartogram_0.2-2.tar.gz

Эта команда должна установить пакет R из источника. Для этого вам понадобится работающий компилятор Си. Из ваших сообщений об ошибках, похоже, у вас есть некоторые проблемы с нашим компилятором Си. Убедитесь, что это работает (или у вас есть). Проверьте этот вопрос: C компилятор для Windows?

Другие вопросы по тегам