R的不同版本如何管理似乎自动从CRAN下载不同的适当软件包版本?

时间:2015-11-25 11:56:20

标签: r version packages libraries

我是否可以利用它来编写一个函数或进程来下载特定版本的R的软件包(和软件包依赖性),只有1 R安装可用?

背景

我在安装了许多R版本的网站上工作,主要是在Windows环境和计算机上。其中一些环境/机器无法连接到互联网,但用户要求在其上安装某些软件包/库以供使用。

我可以使用的R版本不是标准化的。我无法在连接互联网的计算机上使用install.packages()并手动将生成的下载包​​转移到未连接的计算机上,因为在未连接的计算机上生成的R /包版本可能不兼容。

让我们接受以这种规模手动搜索和下载所有包和依赖项是不可能的。对包裹的需求将是不变的和变化的,并且无法提前预测。我不知道如何轻松自动地确定与各种版本的R匹配的软件包和依赖项的版本号,而无需通过CRAN软件包历史记录/存档等痛苦的手动拖网。我知道似乎没有" Rversion =" install.packages()或类似的东西的参数。我发现的大部分套餐都是"种类的"地址包版本控制要么假设您已经知道您需要哪些包和版本,或者您已经拥有它们。用户无法向我提供包/依赖版本信息:他们只知道他们想要一个名为" X"在他们的计算机上,但我可以找出他们正在运行的R版本。

我很想说我的努力是无望的......除了......在我看来,可以连接到CRAN的不同版本的R以某种方式下载与他们自己的版本相对应的软件包。

如果我错了,请纠正我。但是,如果它们是,那么它们正在利用一些方法,功能或技术......从表面上看,我没有看到为什么我不能至少部分地或理论上利用这种相同的技术或者机制,如果我能确切地知道它是什么。

我的困境的替代答案(自动下载与R的各种发行版本相对应的软件包/版本),如果我的查询线看起来毫无结果,也将不胜感激。

以下不是我问题的有效解决方案:

  • 升级/标准化您的R版本
  • 需要多台计算机管理员权限的东西(我可以将其扩展到一台计算机/环境)
  • 使用linux
  • 让用户吮吸/获取软件包版本控制信息/自己动手
  • 获取非互联网连接机器的互联网/ CRAN访问权限
  • 本地镜像CRAN

2 个答案:

答案 0 :(得分:2)

这不是一个答案,但评论太长了。如果我理解正确,用户可以告诉你他想要包X,你必须提供给他。我想你可以在某个地方下载正确的版本并将包转移到用户的机器上。

这似乎很难做到,但也许可行。但是,它需要用户的一点合作。

正如评论中已经说过的那样,package archive存在并且具有每个包的所有旧版本。请记住以下行:

installed.packages()

为您提供计算机上安装的所有软件包。我不认为这对用户来说太过分了。

我会按照以下步骤进行操作。

  • 转到所需包的存档页面。
  • 下载最新的软件包源代码,展开它并查看DESCRIPTION文件。
  • 从中查看该软件包是否与用户的R版本兼容。如果没有,请下载第二个新版本,依此类推。
  • 检查Depends文件的ImportDESCRIPTION字段,以便通过检查installed.packages()从用户返回的对象来查看依赖关系并查看它们是否已安装机。
  • 如果缺少一个包,请递归遍历以满足所有依赖项。
  • 如果你已经完成了,现在你需要编译每个下载的包(因为档案似乎只有源代码,你需要编译它以将它分发给用户的机器)。

上述所有步骤都可以通过编写一个简单的函数来完成。处理所有异常可能是咒骂,但我想在R(或其他编程语言,取决于您的专业知识)中执行上述操作应该不会那么难。

答案 1 :(得分:0)

这对评论来说太长了,但不是完全答案。

我是第二个包存档。我想你会发现你需要/想要经常从源代码安装。这可能是错误的,但如果是,则意味着在每台机器上安装Rtools和devtools,这可能是也可能是不可行的。

为了避免在任何地方安装Rtools,您可以做的就是让您的互联网连接机器存储您可能想要与之交谈的每个R版本,根据需要卸载/重新安装Rtools,编译,然后进入您的包目录和将已编译的包传送到目标计算机。

一旦你安装了devtools版本的R(和Rtools),那么我认为你会有一些接近可行的情况。我能想到的最后一步是你可能想要设置自己的CRAN镜像并在本地提取存档副本,以帮助世界,并减少对其他镜像的滥用。

从右侧版本的R上的互联网/镜像连接机器上,您可以检查所需软件包的版本树,从最新版本开始,然后使用devtools::install_version从命令行向后运行Rscript直到您成功安装。从那里进入R

应该是一件简单的事情

对于其他可能有用的工具,请参阅:

  • sessionInfo
  • R.oo::getDescriptionFile