📌  相关文章
📜  使用不同版本的 R 包

📅  最后修改于: 2022-05-13 01:54:33.432000             🧑  作者: Mango

使用不同版本的 R 包

R 编程语言通过在线存储库中提供的不同包提供不同的功能。官方存储库 CRAN 不断更新这些包,并经常发布更新版本的包。

R 的包系统默认设置为覆盖现有版本的包,以便用户始终拥有最新版本。因此,任何更新都将覆盖以前的版本。因此,如果您想使用该包的两个版本,则必须将其安装在不同的位置,并且必须通过指定该位置来相应地导入它。

句法:

返回默认查看包的路径。第一个路径是安装用户选择下载的软件包的用户库。第二个是安装 R 自带的默认包的系统库路径。



要检查安装的软件包,请使用以下命令:

它返回有关所有安装包的信息,如版本、安装路径、对 R 版本的依赖、包所需的其他导入。

安装不同版本的包

有时,最新版本的软件可能会发生剧烈变化,从而使用户恢复到以前的版本。某些函数可能会被弃用,类被删除,函数参数被更改,这对于使用早期版本的现有用户来说可能会很麻烦。因此,用户可能希望为特定函数安装过时的版本,然后恢复到现有库。

句法:

此函数在用户指定的位置 lib 安装包。由于缺少用于构建/编译包的适当工具链,此函数可能无法工作。默认情况下,R for Windows 安装来自 CRAN 的预编译“二进制包”。 CRAN 存档包源而不是我们需要安装的二进制文件。因此,需要 Rtools 来构建和编译库。

CRAN 上的“版本”包依赖于 Revolution Analytics MRAN 服务器来安装特定版本的包,而无需安装 Rtools 来安装二进制包,但这可以追溯到 MRAN 发布的日期,即接近 2014 年 9 月 17 日.



句法:

从 MRAN 服务器下载并安装截至特定日期托管在 CRAN 上的最新版本的软件包。

例子:

R
# install yesterday's version of dslabs
versions::install.dates('dslabs', Sys.date() - 1)


R
# install specific version of caret
install.versions('caret', '6.0-77')


R
# R program to illustrate working
# with different versions of a package.
  
library(versions)
library(fs)
  
# Create a new folder to install the 
# latest version of package.
old_lib_loc <- .libPaths()[1]
new_lib_loc <- path_home_r('R/new_lib/')
  
# install the latest version in the
# new location.
versions::install.versions('caret', version = '6.0-86', lib = new_lib_loc)
                  
# load the library from the default
# path(old_lib_loc) as lib is unspecified.
library(caret) 
  
# Creating sample sets
dat <- data.frame(x = rnorm(50))
class <- sample(c("Y", "N"), 50, TRUE)
  
# Training a model to fit data
fit <- train(dat, class, method = "glm")   
  
# Check the version of caret package in use
packageVersion('caret')   
  
extractProb(list(fit))    
# Displays error due to a internal bug 
# in that version of code.
  
# Detach the current caret package
detach("package:caret")    
  
#if(!require("caret"))
  #install.packages("caret")
  
# loads the newer version of package
# installed in new_lib
library(caret, lib.loc = new_lib_loc)  
  
# check the version of caret package in use
packageVersion('caret')  
  
# returns the training and test data prediction as
# the bug is fixed in this version of package.
extractProb(list(fit))


R
# R program with renv initialized 
# in project directory.
  
# install digest 
# Installs the package into a private 
# library.
renv::install("digest")
  
# save library state to lockfile
# Updates a lockfile capturing the state 
# of a project's R package dependencies. 
# The lockfile can be used to later restore 
# these project's dependencies as required.
renv::snapshot()
  
# remove digest from library
renv::remove("digest")
  
# check library status
# Reports the differences between the 
# project's lockfile and the current state
# of the project's library (if any)
renv::status()
  
# restore lockfile, thereby reinstalling digest
# Restore a project's dependencies from a lockfile,
# as previously generated by snapshot().
renv::restore()


R
# R program to change renv settings.
  
# disable automatic snapshots
auto.snapshot <- getOption("renv.config.auto.snapshot")
options(renv.config.auto.snapshot = FALSE)
  
# restore automatic snapshots
options(renv.config.auto.snapshot = auto.snapshot)


句法:

从 MRAN 服务器下载并安装 CRAN 上托管的包的命名版本。

例子:

电阻



# install specific version of caret
install.versions('caret', '6.0-77')

如果您已经有一个版本的包,并且想要安装另一个版本,则必须更改 R 存储库的目录的路径。即使版本不同,R 也会覆盖以前安装的相同库。

在 R 会话中加载包

R 搜索活动库路径以查找请求包的安装。由于一个包的两个版本都安装在不同的位置,库函数仍然可以通过指定该包的位置来加载该包。

句法:

默认情况下, lib.loc = NULL这意味着 R 将在其默认库路径中搜索包。

以下示例说明了如何使用不同版本的包。

例子:

电阻

# R program to illustrate working
# with different versions of a package.
  
library(versions)
library(fs)
  
# Create a new folder to install the 
# latest version of package.
old_lib_loc <- .libPaths()[1]
new_lib_loc <- path_home_r('R/new_lib/')
  
# install the latest version in the
# new location.
versions::install.versions('caret', version = '6.0-86', lib = new_lib_loc)
                  
# load the library from the default
# path(old_lib_loc) as lib is unspecified.
library(caret) 
  
# Creating sample sets
dat <- data.frame(x = rnorm(50))
class <- sample(c("Y", "N"), 50, TRUE)
  
# Training a model to fit data
fit <- train(dat, class, method = "glm")   
  
# Check the version of caret package in use
packageVersion('caret')   
  
extractProb(list(fit))    
# Displays error due to a internal bug 
# in that version of code.
  
# Detach the current caret package
detach("package:caret")    
  
#if(!require("caret"))
  #install.packages("caret")
  
# loads the newer version of package
# installed in new_lib
library(caret, lib.loc = new_lib_loc)  
  
# check the version of caret package in use
packageVersion('caret')  
  
# returns the training and test data prediction as
# the bug is fixed in this version of package.
extractProb(list(fit))

输出:

[1] ‘6.0.86’
           N         Y obs pred model dataType  object
1  0.6343887 0.3656113   N    N   glm Training Object1
2  0.6359912 0.3640088   N    N   glm Training Object1
.
.
49 0.6805284 0.3194716   N    N   glm Training Object1
50 0.6582383 0.3417617   N    N   glm Training Object1
[1] ‘6.0.86’
           N         Y obs pred model dataType  object
1  0.6343887 0.3656113   N    N   glm Training Object1
2  0.6359912 0.3640088   N    N   glm Training Object1
.
.
49 0.6805284 0.3194716   N    N   glm Training Object1
50 0.6582383 0.3417617   N    N   glm Training Object1

使用 packrat 或 renv

R 会话中的任何安装、升级或更改都会导致所有 R 会话共享的 R 目录发生更改。不同的项目可能需要不同的包,因此可能有很多不同的包依赖项。因此,我们可能会更改在全局环境中共享的某些功能,从而影响所有其他会话。所以我们需要一个像Python这样的“虚拟环境”来管理这些相互冲突的依赖关系。因此,项目本地库的想法诞生了。



' Packrat ' 和' renv ' 是 R 中用于这些目的的包。 renv 是 Packrat 的继承者。这些包有助于隔离不同的项目,通过为每个项目提供自己的私有包库,使一个项目不会影响另一个项目,使项目可移植,以便轻松安装项目所依赖的包并重现确切的包版本项目需要。

Renv 是 R 的依赖项管理工具包。使用“renv”,您可以创建和管理项目本地 R 库,保存这些库的状态,然后根据需要恢复您的库。这些工具可以一起帮助使您的项目更加独立、可移植和可重现。

如果你已经开始做一些项目,那么在实际工作之前你必须解决版本控制问题;找到要使用或必须处理依赖项的正确版本的包。 Renv 提供了更清晰、更简单的方法来做到这一点。 Renv 解决了包管理,但不处理不同版本的R。 使用renv 的工作流程:

  • 当您将项目开发到某个阶段,并且您认为您或其他人将来可能必须再次回到它时,通过运行renv::init()您可以初始化 renv。

发现当前项目中使用的包,然后使用这些包初始化项目本地私有 R 库。然后将使用中的任何包的当前安装版本(如在默认 R 库中检测到的)安装到项目的私有库中。

要启动一个新项目并在其中初始化 renv,请使用 project 参数指定项目目录的位置。

这将设置一个带有私有库的项目本地环境,并确保将您正在使用的所有包安装到该库中。您将发现所有包和版本依赖项并将其存储在名为renv.lock的文件中。 Renv 还将写入活动项目目录中的文件,包括锁定文件和项目目录中的文件夹“renv”,其中包含用于加载项目的专用库和激活脚本。



跑 。 libPaths()检查项目的库路径,其中初始化了 renv。

  • 要将项目库的状态保存到renv.lock调用renv::snapshot()或调用renv::restore()以恢复到锁定文件中编码的先前状态。
  • 通过运行renv::restore() ,您将能够从 renv.lock 重新安装所有依赖项,以确保您已将项目设置得尽可能接近您离开时的位置,并大大减少遇到相关问题的机会与包版本。

例子:

电阻

# R program with renv initialized 
# in project directory.
  
# install digest 
# Installs the package into a private 
# library.
renv::install("digest")
  
# save library state to lockfile
# Updates a lockfile capturing the state 
# of a project's R package dependencies. 
# The lockfile can be used to later restore 
# these project's dependencies as required.
renv::snapshot()
  
# remove digest from library
renv::remove("digest")
  
# check library status
# Reports the differences between the 
# project's lockfile and the current state
# of the project's library (if any)
renv::status()
  
# restore lockfile, thereby reinstalling digest
# Restore a project's dependencies from a lockfile,
# as previously generated by snapshot().
renv::restore()

以下程序演示了如何在项目目录中工作时配置 renv 设置,例如启用或禁用自动快照。

例子:

电阻

# R program to change renv settings.
  
# disable automatic snapshots
auto.snapshot <- getOption("renv.config.auto.snapshot")
options(renv.config.auto.snapshot = FALSE)
  
# restore automatic snapshots
options(renv.config.auto.snapshot = auto.snapshot)