我正在尝试建立像here的制图
从链接安装不起作用:
`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)
都不来自zip文件:
我怎么解决这个问题?
我正在 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
最佳答案
在Windows上安装Rcartogram
Rcartogram是一个R包(由Duncan Temple Lang提供),其主要目的是为某些C代码(由Mark Newman编写)提供R包装器,该代码实际上完成了构造 map (又称对 map 进行变形)的工作。马克· Newman (Mark Newman)编写的C代码使用FFTW(西方最快的傅立叶变换)编译库。
Truc Viet Le在您的问题中的链接描述了如何在Unix系统上安装Rcartogram。将Rcartogram放入Windows系统还涉及一些额外的技巧和陷阱,即使从本质上讲,它几乎是相同的过程。
要在Windows系统上安装Rcartogram,您首先需要安装所有先决条件,即:
然后,您需要在首次安装Rcartogram时告诉R在哪里可以找到FFTW库,并且几乎可以肯定的是,每当您加载Rcartogram时(例如通过R session 中的
library(Rcartogram)
),都需要让R知道在哪里可以找到FFTW库。我发现我还需要对Rcartogram R代码进行一些非常小的更改(自编写以来,主要是为了使其与R语法的更改保持一致),以使其能够愉快地安装并在Windows上正确运行。
因此,完整的答案涉及几个步骤。
步骤1:安装Rtools套件
我怀疑您需要安装Rtools才能摆脱状态127错误。有关如何执行此操作的官方说明,请参见http://cran.r-project.org/doc/manuals/R-admin.html#The-Windows-toolset。关于如何将Rtools安装到Web上其他地方的Windows系统中的用户友好说明,请参见https://github.com/stan-dev/rstan/wiki/Install-Rtools-for-Windows。 (官方说明还告诉您如何安装许多其他内容,如果您想在Windows上从源代码构建R本身,或者使用LaTeX生成软件包文档,则需要这些内容,但是您不需要所有这些东西来获取Rcartogram在职的)。
答案更长一点:
现在,我可以从PATH中删除对Rtools所在目录的引用,从而复制
status 127 error
。当我这样做时,Windows cmd shell(您可能在其中键入R CMD INSTALL …
的位置找不到Rtools可执行文件,并导致127错误消息。同样,尝试从R内部运行install.packages()
也会以相同的方式失败,因为在后台install.packages
调用Windows cmd shell 。为什么需要Rtools? 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位计算机上,您都需要和两个版本。 (此外,也许可以通过安装Rcartogram时设置标志来摆脱一种方法,但是我自己还没有测试过该方法)。将32位版本解压缩到子目录
/i386
中,将64位版本解压缩到子目录/x64
中。就我而言(参见下文),我将它们作为“C:/msys/fftwtest”的子目录。 (在这些子目录旁边是R使用的约定-从理论上讲,您可以将它们放在其他位置,但是为什么要加倍复杂!)。使我困扰了很长时间的一个陷阱是这些库是动态库(即.dll),因此-以后-我需要确保在将它们安装到PC上时将它们放在我的位置上PATH(或者通过添加位置-aka目录-安装它们的位置来更改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 的文件的目录,并且链接器在编译步骤结束时将所有内容放在一起时需要链接器。可能是“.dll”(在这种情况下,子目录可能是\bin而不是\lib),或者可能是“.a”或“.la”(R使用静态FFTW库时查找的内容)一旦我学会了如何从源代码编译FFTW,就创建了该文件。
需要2个目录,因为R默认情况下会尝试在Windows计算机上安装Rcartogram的32位和64位版本。如果您提供.dll格式的FFTW库文件,则这些文件与PATH中必须存在的库完全相同(因为当您尝试执行库(Rcartogram)时,R需要在加载已安装的库时再次查找FFTW dll库。 Rcartogram程序包)(此外,这就是为什么我最终编译了自己的静态FFTW库,因此不必在Windows环境中弄乱我的PATH变量的原因)。
如果您使用的是从上面的链接下载的二进制文件,则fftw3.h和libfftw3.dll文件均为,它们都位于同一(子)目录中,和则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
(还要注意必须在-
和-L
标志的开头,每个-l
(减号)前的空格处)。 Makevars.win文件在做什么?它告诉R安装过程在尝试预处理,编译和链接Rcartogram的src子目录中的C代码时将需要的标志。
PKG_CPPFLAGS
的值是C预处理程序的一组标志,而PKG_LIBS
的值是链接步骤的一组标志。-I
是一个标志,上面写着“当C预处理程序查找包含文件时,尝试在以下目录中查找”,因此在上面的示例中,它指示查找"main libfftw directory\x64"
。它寻找的包含文件是fftw3.h
(该文件名埋在Rcartogram中的C代码中)-L
标志显示“当链接器从您希望使用的任何库中查找文件时,尝试在以下目录中查找”,因此-L"main libfftw directory\x64"
说尝试在"main libfftw directory\x64"
目录中查找。您可以(并且需要)在该搜索路径上拥有多个目录-链接器一直不断查找,直到找到所需的内容为止(或者用完了很多地方可以查找并给出错误消息),然后添加-l
标志提供链接器应查找的库文件的名称,而不是逐字记录-而是根据您输入的内容(遵循unix世界的一个(对我来说有点疯狂))构造该名称。由于库的文件名始终以“lib”开头,因此约定的第一部分是将“lib”保留在标记中的名称之外。库的文件名可以具有几个不同的扩展名(例如“.dll”或“.a”),因此约定的第二部分是您也保留了文件扩展名之外的-l
标志值,并让链接器理清其所需的内容。因此,–lfftw3
表示查找一个名为libfftw3.dll
或一个名为libfftw3.a
的文件(我不确定还有其他可能的扩展名)。 下载的dll实际上称为
libfftw3-3.dll
(不同于我自己编译的dllt_code),因此需要将libfftw3.a
标志更改为–l
注意:如果您正在使用下载的使用
–lfftw3-3
的FFTW库,请确保也将它们放在PATH中(请参阅步骤2的最后一段)。步骤4:对Rcartogram C代码的小修正
我发现必须对Rcartogram代码本身进行另外两个小更改,才能使事情正常运行。
首先在文件R/cart.R中有两行,这两行都使用
.dll
函数。我需要在.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")
同样,在购物车的更下方。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的演示将给出错误的结果(即使运行正常)。
步骤5:实际安装Rcartogram
您现在应该可以安装Rcartogram。任何一个
.Call
更改为)已解压缩和修改的Rcartogram程序包源代码所在的位置,然后键入cd
或R CMD INSTALL --preclean .
,来创建install.packages(".", repos = NULL, type = 'source', INSTALL_opts = "--preclean")
之所以有效,是因为您已将.
ed到Rcartogram源代码所在的目录。 cd
标志告诉R整理掉Rcartogram中C代码开始之前的任何早期(失败的)尝试中残留的中间文件。如果您到此为止并且仍然遇到问题,那么也可以添加一个--preclean
标志。它提供了有关安装失败原因的更多详细信息。第6步:欣赏变形贴图
我刚刚真正开始真正使用Rcartogram(花了一段时间才走到这一步!),但是您可能想查看getcartr --- R package。该程序包使用Rcartogram,看起来很整洁! 和在github网站上给出的安装说明对我来说是第一次工作(尽管我已经安装了devtools并可以正常工作)。
希望这对您有所帮助(并祝贺所有阅读此书的人)
2017年5月更新
我已经有两年没有这样做了(因此不能保证它仍然可以工作),但是在我写完上面的文章之后,我在https://github.com/Geoff99/Rcartogram/tree/WindowsInstall上创建了一个RCartogram的 fork 副本。
请参阅WindowsInstall分支,其中包括
--debug
,旨在简化在Windows上安装RCartogram的过程,以及src/Makevars.win
中的文章还要全面的教程。请参阅以下链接https://github.com/Geoff99/Rcartogram/blob/WindowsInstall/vignettes/README.WindowsInstall.Tutorial.Rmd (要使用本教程,您需要使用分支的存储库的WindowsInstall分支!)