2011-08-02 67 views
32

我正在开发我的第一个R包(使用R 2.13,Ubuntu 10.10)。让我们把它,让我们说,在R /目录下的代码开始与线库(栏),其中酒吧是现有的包,在CRAN,其上FOO依赖。我的描述文件包含行:如何在使用“R CMD INSTALL”安装R软件包时安装依赖关系?

Depends: bar 

当包是准备进行测试,我安装在本地使用:

R CMD INSTALL foo_1.0.tar.gz 

但是,如果没有安装,我看到:

ERROR: dependency ‘bar’ is not available for package ‘foo’ 

显然,如果我是使用install.packages()从CRAN安装,将同时安装。所以我的问题是:如果需要,我如何确保安装CRAN包bar当我使用R CMD INSTALL安装我的包foo?这是一个配置脚本的工作吗?

回答

14

其实,重读R附加指导,它没有说的是,R CMD INSTALL将获得依赖从CRAN。 R中的install.packages()方法可以做到这一点,但乍一看我不认为R CMD INSTALL会这样做。

您可以使用install.packages从是.tar.gz安装,但你必须设置回购= NULL,然后适用:

dependencies: logical indicating to also install uninstalled packages 
      on which these packages depend/suggest/import (and so on 
      recursively). Not used if repos = NULL. 

我怀疑我们该做的是让依赖关系不在DESCRIPTION文件中,然后运行R并在干净环境中测试构建时对这些构建install.packages()。

+1

是的,我的理解是DESCRIPTION声明了依赖关系,但不安装它们。并且为tarball设置repos = NULL的问题是依赖包将不会从CRAN中获取。我试图让自己置身于下载和安装我的tarball的用户的脚下;他们是否应该阅读文档和错误消息或者是否有解决方案? – neilfws

+0

解决方案是让您将软件包放在CRAN上,然后让用户执行install.packages并获得依赖关系。我想可能有一些原因,你为什么不能这样做。从tarballs安装不是一个“简单的用户”操作,所以它们不会被盗用,并且应该能够读取错误消息和文档。 – Spacedman

+0

对。我猜测在本地测试时,我知道我有依赖关系,如果它发布到CRAN,CRAN会照顾依赖关系,所以确实没有问题:) – neilfws

1

执行此操作的机制是在DESCRIPTION文件的depends字段中添加一个条目。

Depends: bar 

这将加载bar库,如果已经安装,否则将CRAN安装。

这在Writing R extensions手册的第1.1.1节中描述:http://cran.r-project.org/doc/manuals/R-exts.html#The-DESCRIPTION-file

+2

我在描述依赖关系字段,但是当我尝试安装foo的酒吧不是从CRAN安装。 – neilfws

+4

它不能。但是,如果当* your * package foo在CRAN *上并且*用户选择了它,她也会得到一个条。或者,您可以创建一个本地回购,并将bar和foo都放入,然后获得相同的行为。 –

12

幸运Devtools提供了一种简单的解决方案:install_deps()

install_deps(PKG =,依赖=逻辑,线程= getOption( “n个CPU ”1)“。”)

参数:
PKG :包描述,可以是路径或包名。请参阅 'as.package'以获取更多信息

相关性:“逻辑”表示还安装卸载的软件包 这个'pkg'依赖于/链接到/建议。请参阅参数 “install.packages”的“依赖关系”。

线程数:用于安装 依赖关系的并发线程数。如果未设置 ,它默认为''Ncpus''或'1'。

实例:

 
install_deps(".") 
install_deps("/path/to/package",dependencies="logical") 
+1

thanks;这是一个“pre-devtools”问题,但现在的生活要容易得多 – neilfws

+0

这可以在你想要安装的软件包的目录下工作,但不能用'.tar.gz'文件。实际上,在实际安装'.tar.gz'文件之前,您无法将路径传递给'.tar.gz'文件以'install_deps'来安装依赖关系。 –

+0

@neilfws请将此答案标记为正确。 – emisilva

3

我结束了只使用一个bash这里文档并指定云镜子找到的依赖关系:

sudo R --vanilla <<EOF 
install.packages('forecast', repos='http://cran.us.r-project.org') 
q() 
EOF 

将R包是 “预测”,我使用的云镜是http://cran.us.r-project.org。如果你想使用不同的镜像,在这里他们都是:https://cran.r-project.org/mirrors.html

上面的工作对我来说,R软件包到AWS EMR bootstrap shell脚本。

0

脚本使用类似@Jonathan乐,但更好的:

sudo R --vanilla -e 'install.packages("forecast", repos="http://cran.us.r-project.org")'