安装 Rcartogram 包 - 错误信息

installing Rcartogram packages - error message

我正在尝试构建像 here

这样的制图

从 link 安装不工作:

`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")

Installing package into ‘C:/Users/Milena/Documents/R/win-library/3.2’ (as lib is unspecified) * installing source package Rcartogram ... **********************************************<br> WARNING: this package has a configure script It probably needs manual configuration **********************************************

** libs

*** arch - i386 Warning: running command '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"' had status 127 ERROR: compilation failed for package 'Rcartogram' * removing 'C:/Users/Milena/Documents/R/win-library/3.2/Rcartogram' Warning in install.packages : running command '"C:/PROGRA~1/R/R-3.2.0/bin/x64/R" CMD INSTALL -l "C:\Users\Milena\Documents\R\win-library.2" "C:/Users/Milena/Downloads/Rcartogram_0.2-2.tar.gz"' had status 1 Warning in install.packages : installation of package ‘C:/Users/Milena/Downloads/Rcartogram_0.2-2.tar.gz’ had non-zero exit status

我该如何解决这个问题?

我正在 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

要安装 Rcartogram,您需要从网站 http://www.omegahat.org/Rcartogram/ 下载软件包并从源代码安装。打开您的终端(在 Windows 中,它称为命令提示符),将目录更改为下载文件所在的位置并键入:R CMD INSTALL Rcartogram_0.2-2.tar.gz

该命令是从源安装 R 包。为此,您需要一个可用的 C 编译器。从您的错误消息来看,您似乎在使用我们的 C 编译器时遇到了一些问题。确保它是否有效(或者你有一个)。看看这个问题:C compiler for Windows?

正在 Windows

安装 Rcartogram

Rcartogram 是一个 R 包(由 Duncan Temple Lang 开发),其主要目的是为一些 C 代码(由 Mark Newman 编写)提供一个 R 包装器,它实际上完成了构建制图(又名变形地图)的工作). Mark Newman写的C代码利用了FFTW(西方最快的Fourier T运行sform)编译库

Truc Viet Le 提出的问题中的 link 描述了如何在 Unix 系统上安装 Rcartogram。将 Rcartogram 引入 Windows 系统还涉及一些额外的技巧和陷阱,尽管其核心过程几乎相同。

要在 Windows 系统上安装 Rcartogram,您首先需要安装所有先决条件,即:

  • Rtools 程序套件(您需要能够将涉及 C 代码的任何 R 包安装到 Windows 机器上),以及
  • FFTW 库(Rcartogram 代码使用)。

然后,当您第一次安装 Rcartogram 时,您需要告诉 R 在哪里可以找到 FFTW 库,并且几乎肯定需要让 R 知道在加载 Rcartogram 时在哪里可以找到 FFTW 库,例如通过 library(Rcartogram) 在 R 会话中。

我发现我还需要对 Rcartogram R 代码进行一些非常小的更改(主要是为了使其与编写后对 R 语法的更改保持一致)以便顺利安装,并且 运行 在 Windows.

上正确

所以完整的答案涉及几个步骤。

第 1 步:安装 Rtools 套件

我怀疑您需要安装 Rtools 才能克服状态 127 错误。有关如何执行此操作的官方说明,请参见此处 http://cran.r-project.org/doc/manuals/R-admin.html#The-Windows-toolset. There are user friendly explanations of how to install Rtools into a Windows system elsewhere on the web --- see for example https://github.com/stan-dev/rstan/wiki/Install-Rtools-for-Windows。 (官方说明还告诉你如何安装许多其他东西,如果你想从 Windows 上的源代码构建 R 本身,或者使用 LaTeX 生成包文档,你需要这些,但你不需要所有这些让 Rcartogram 工作的东西)。

稍微长一点的回答: 我现在可以复制您的 status 127 error --- 通过从我的 PATH 中删除对 Rtools 所在目录的引用。当我这样做时,Windows cmd shell(您可能会在其中键入 R CMD INSTALL … 找不到 Rtools 可执行文件,这会导致 127 错误消息。同样尝试 运行 R 中的 install.packages() 也以同样的方式失败,因为在引擎盖下 install.packages 调用 Windows cmd shell.

为什么需要 Rtools? Well Rcartogram 是一个包含 C 代码和纯 R 代码的包。事实上,它主要是 C 代码——来自 Mark Newman。从源代码安装包含 C 代码的包需要 C 编译器。事实上,最好(几乎是必不可少的)它是构建 R 本身的同一个 C 编译器。这就是 Rtools 的主要功能——可安装在 Windows 版本的 C 编译器上。 运行 Windows 中的 C 编译器也需要一些额外的 shell 命令(又名小程序),这就是 Rtools 的其余部分。大多数(开源)C 社区似乎在 Unix(或其变体)世界中工作,那些额外的命令(实际上是 C 编译器本身)是 Unix 中“标准”系统的一部分。只有我们这些在 Windows 工作的人需要安装 Rtools,它是从 Unix 到 Windows 的必要工具的端口。

第 2 步:安装 FFTW 库

最初我从这里 http://www.fftw.org/ 得到了 FFTW 库。

有两个版本,一个32位版本和一个64位版本。在 Windows 64 位机器上你需要 both 版本。 (顺便说一句,可能有一种方法可以让你只用一个方法,通过在安装 Rcartogram 时设置标志,但我自己还没有测试过这条路线)。将 32 位版本解压到子目录 /i386,将 64 位版本解压到子目录 /x64。在我的例子中(见下文),我将它们作为 "C:/msys/fftwtest" 的子目录。 (除了这些子目录之外,还有 R 使用的约定 - 理论上您可以将它们放在其他地方,但为什么会变得更加复杂!)。

一个困扰我很长一段时间的陷阱是这些库是动态库(即 .dll s),所以 - 后来 - 我需要确保在我的电脑上安装它们时我把它们放在我的 PATH 上的位置(或者我通过添加位置 - 也就是目录 - 它们的安装位置来改变我的 PATH )否则我在 R 在完成安装包之前所做的最终检查中收到非常无用的错误消息。 32 位和 64 位(子)目录都应包含在您的 PATH 中。

第 3 步:告诉 R 在哪里可以找到 FFTW 库

告诉 R(在 Windows 机器上)在尝试安装 Rcartogram 时在哪里可以找到 FFTW 库的技巧是将 src/Makevars.win 文件添加到 Rcartogram 的 src 子目录中包裹。这意味着您必须先解压缩 Rcartogram tar.gz 文件,然后才能进行此更改。 (旁白:我使用 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行中提到的目录是包含C预处理器需要的名为fftw3.h的头文件的目录。无论您指向 32 位(\i386 子目录)还是 64 位(\x64 子目录)都没有关系 - fftw3.h 文件是一个 C 源文件,无论 R 正在安装什么架构,它都是一样的对于.

PKG_LIBS行中提到的2个目录是可以找到名为libfftw3.something的文件的目录,linker在编译步骤结束时将所有内容放在一起时需要。 something 可能是“.dll”(在这种情况下,子目录可能是 \bin 而不是 \lib),也可能是“.a”或“.la”(这就是R 会在使用静态 FFTW 库时进行查找,这些库是我在学习了如何从源代码编译 FFTW 后创建的)。

2 个目录是必需的,因为 R 默认情况下会尝试在 Windows 机器上安装 32 位和 64 位版本的 Rcartogram。如果您以 .dll 格式提供 FFTW 库文件,那么这些库必须与您的 PATH 中完全相同(因为当您尝试执行 library(Rcartogram) R 需要在加载已安装的文件时再次找到 FFTW dll 库Rcartogram 包)(顺便说一句,这就是为什么最后我编译了自己的静态 FFTW 库,所以我不必在 Windows 环境中弄乱我的 PATH 变量)。

如果您使用从上面 link 下载的二进制文件,fftw3.h 和 libfftw3.dll 文件 都在同一个文件中(子)目录,and libfftw3.dll 文件实际上称为 libfftw3-3.dll,所以在这种情况下你的 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 的名称 - 即您在解压缩下载的 FFTW 二进制文件时在其下创建 /i386/x64 子目录的父目录
  • 删除\include\lib子目录,以及
  • -libfftw3更改为-libfftw3-3(还要注意必须在每个-前面有一个space(减号)在 -L-l 标志的开头。

Makevars.win 文件在做什么?它告诉 R 安装过程 flags 它在尝试预处理、编译和 link Rcartogram 的 src 子目录中的 C 代码时需要。 PKG_CPPFLAGS 的值是 C 预处理器的一组标志,PKG_LIBS 的值是 link 步骤的一组标志。

  • -I 是一个表示 'try looking in the following directory when the C pre-processor is looking for include files' 的标志,因此在上面的示例中它表示要查看 "main libfftw directory\x64"。它寻找的包含文件是 fftw3.h(该文件名埋在 Rcartogram 的 C 代码中)
  • -L 标志表示 'try looking in the following directory when the linker is looking for files from any library that you expect to use',因此 -L"main libfftw directory\x64" 表示尝试在 "main libfftw directory\x64" 目录中查找。您可以(并且需要)在该搜索路径上有超过 1 个目录 - linker 一直在寻找直到找到它正在寻找的东西(或者 运行s 不在寻找的地方并给出一条错误消息)和
  • -l 标志给出了 link 用户应该查找的库文件的名称,但不是逐字逐句地给出了名称——相反,该名称是根据您在 a 之后输入的内容构建的(稍微对我来说很疯狂)来自 unix 世界的约定。因为库的文件名 总是 以“lib”开头,所以约定的第一部分是将 "lib" 放在标志中的名称之外。库的文件名可以有几个不同的扩展名(例如“.dll”或“.a”),因此约定的第二部分是您将文件扩展名从 -l 标志值中保留为好吧,让 linker 找出它想要的东西。所以 –lfftw3 说寻找一个名为 libfftw3.dll 或一个名为 libfftw3.a 的文件(可能还有其他可能的扩展名,我不确定)。

下载的dll实际上叫libfftw3-3.dll,(不像我自己编译的叫libfftw3.a)所以需要把–l标志改成[=51] =]

NB 如果您正在使用下载的 FFTW 库,该库使用 .dlls 确保您已将它们放在您的 PATH 中(请参阅第 2 步的最后一段)还有。

第 4 步:对 Rcartogram C 代码的小修正

我发现我必须对 Rcartogram 代码本身进行另外两个小改动 运行ning。

首先在文件R/cart.R中有两行,都使用了.Call( )函数。我需要向 .Call 函数添加一个参数(即 PACKAGE = "Rcartogram"),例如

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

成为

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

同样,再往下 cart.R 改变的 .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 的演示给出了错误的结果(即使它 运行 OK)。

第 5 步:实际安装 Rcartogram

您现在应该可以安装 Rcartogram 了。

  • 通过打开 cmd window,将目录(cd 更改为)解压缩和修改后的 Rcartogram 包源代码所在的位置,然后键入 R CMD INSTALL --preclean .

  • 通过启动 R 会话,将工作目录设置为 Rcartogram 源所在的位置并键入 install.packages(".", repos = NULL, type = 'source', INSTALL_opts = "--preclean")

. 有效是因为您已经cded 到 Rcartogram 源代码所在的目录。 --preclean 标志告诉 R 在它开始之前清理早期(失败)尝试在 Rcartogram 中编译 C 代码的任何剩余中间文件。如果你走到这一步但仍然遇到问题,也可以添加一个 --debug 标志。它提供了有关安装失败原因的更多详细信息。

第 6 步:享受变形贴图

我自己才刚刚开始实际使用 Rcartogram(我花了一段时间才做到这一点!),但您可能想查看 getcartr --- R package。该包使用 Rcartogram,看起来非常简洁! github 网站上给出的安装说明对我来说是第一次工作(我已经安装了 devtools 并且可以正常工作)。

希望这对您有所帮助(并祝贺所有读到这里的人)

2017 年 5 月更新

我已经好几年没有研究这个了(所以没有 gua运行tees 它仍然可以工作),但是在我写完上面的 post 之后,我创建了一个 forked https://github.com/Geoff99/Rcartogram/tree/WindowsInstall 处的 RCartogram 副本。

请参阅 Windows安装 b运行ch,其中包括

(要使用本教程,您需要使用 fork 存储库的 WindowsInstall b运行ch!)