R - 如何重新加载功能(或更改包优先级)
R - how to reload function (or change package priority)
我正在使用 Matrix 库处理稀疏矩阵。有时,我需要 运行 一个使用 Bioconductor 包的函数,它依赖于 S4Vectors 库。不幸的是,Matrix 中的 "colSums" 函数与 S4Vectors 中的 "colSums" 函数冲突。因此,当我 运行 这个功能时,它破坏了我的 "colSums" 功能,这真的很烦人。
我知道这个问题有两种常见的解决方案:
1) 在加载 Matrix 库之前 加载 Bioconductor 包 - 然而,我很少使用这个功能,所以我更愿意只在需要时加载 Bioconductor 包。
2) 不要调用 "colSums",而是调用 "Matrix::colSums" - 然而,这非常不方便,我需要更改我的整个代码库。
理想情况下,我只加载 Bioconductor 包,运行 我的函数,然后通过卸载 Bioconductor 包或重新加载 Matrix 包来清理我的环境。但是,我在做这些时遇到了麻烦。首先,是否可以重新加载 Matrix::colSums(以替换 S4Vectors::colSums)?其次,当我尝试卸载 S4Vectors 时,R 抱怨因为许多其他包依赖于它。
所以除了为什么 S4Vectors 有一个函数与 R 中最常用的稀疏矩阵包冲突这个明显的问题之外,我想知道这个问题的最佳解决方案是什么?简单地重新加载一个包不可能那么困难,对吧?
示例:
library(lubridate)
lubdridate 覆盖日期。弹出一条消息说:以下对象被“package:base”屏蔽:date
但是您仍然可以使用原始日期功能。
base::date()
所以你没有查看加载顺序。只需具体说明您使用的功能。
如您所知,正确的方法是编写 Matrix::colSums
。
一个不需要重写代码的简单解决方案是添加一行
colSums <- Matrix::colSums
在您的代码中的某处。然后这个 colSums
属于您的全局环境,因此在任何其他库之前被发现。
编辑
我找到了更好的解决方案。
我将使用 plyr
和 dplyr
进行演示,因为它们都具有 arrange
功能并会导致冲突。
示例 1。 dplyr
稍后加载,因此获胜。
library(plyr)
library(dplyr)
environment(arrange)
# <environment: namespace:dplyr>
示例 2。plyr
获胜
# unload libraries
unloadNamespace("plyr")
unloadNamespace("dplyr")
library(dplyr)
library(plyr)
environment(arrange)
关键是搜索顺序,可以通过search
函数找到。
在下面,您可以看到 plyr
出现在 dplyr
.
之前
search()
# [1] ".GlobalEnv" "package:plyr" "package:dplyr" "tools:rstudio"
# [5] "package:stats" "package:graphics" "package:grDevices" "package:utils"
# [9] "package:datasets" "package:methods" "Autoloads" "package:base"
示例3.您可以指定要在搜索列表中加载库的位置; pos
参数。
unloadNamespace("plyr")
unloadNamespace("dplyr")
library(plyr)
library(dplyr, pos=length(search()))
environment(arrange)
# <environment: namespace:plyr>
search()
# [1] ".GlobalEnv" "package:plyr" "tools:rstudio" "package:stats"
# [5] "package:graphics" "package:grDevices" "package:utils" "package:datasets"
# [9] "package:methods" "Autoloads" "package:dplyr" "package:base"
总之,您可以加载 Bioconductor
库并提供一个大数字 pos
。
也就是说,您说 Bioconductor
取决于 S4Vector
而 S4Vector
是导致冲突的原因。不幸的是,您无法直接控制依赖包的位置,因为 require
语句在 Bioconductor
包中。
解决方法是先使用 pos
选项加载 S4Vector
,然后加载 Bioconductor
:
library(S4Vector, pos=10) # replace 10 by an appropriate large number
library(Bioconductor)
那么,S4Vector
将被放在搜索顺序的Matrix
之后。
另一种解决方案
如果你想重新加载Matrix
,那么你也可以这样做:
library(dplyr)
library(plyr)
environment(arrange)
# <environment: namespace:plyr>
unloadNamespace("dplyr")
library(dplyr)
environment(arrange)
# <environment: namespace:dplyr>
我正在使用 Matrix 库处理稀疏矩阵。有时,我需要 运行 一个使用 Bioconductor 包的函数,它依赖于 S4Vectors 库。不幸的是,Matrix 中的 "colSums" 函数与 S4Vectors 中的 "colSums" 函数冲突。因此,当我 运行 这个功能时,它破坏了我的 "colSums" 功能,这真的很烦人。
我知道这个问题有两种常见的解决方案: 1) 在加载 Matrix 库之前 加载 Bioconductor 包 - 然而,我很少使用这个功能,所以我更愿意只在需要时加载 Bioconductor 包。 2) 不要调用 "colSums",而是调用 "Matrix::colSums" - 然而,这非常不方便,我需要更改我的整个代码库。
理想情况下,我只加载 Bioconductor 包,运行 我的函数,然后通过卸载 Bioconductor 包或重新加载 Matrix 包来清理我的环境。但是,我在做这些时遇到了麻烦。首先,是否可以重新加载 Matrix::colSums(以替换 S4Vectors::colSums)?其次,当我尝试卸载 S4Vectors 时,R 抱怨因为许多其他包依赖于它。
所以除了为什么 S4Vectors 有一个函数与 R 中最常用的稀疏矩阵包冲突这个明显的问题之外,我想知道这个问题的最佳解决方案是什么?简单地重新加载一个包不可能那么困难,对吧?
示例:
library(lubridate)
lubdridate 覆盖日期。弹出一条消息说:以下对象被“package:base”屏蔽:date 但是您仍然可以使用原始日期功能。
base::date()
所以你没有查看加载顺序。只需具体说明您使用的功能。
如您所知,正确的方法是编写 Matrix::colSums
。
一个不需要重写代码的简单解决方案是添加一行
colSums <- Matrix::colSums
在您的代码中的某处。然后这个 colSums
属于您的全局环境,因此在任何其他库之前被发现。
编辑
我找到了更好的解决方案。
我将使用 plyr
和 dplyr
进行演示,因为它们都具有 arrange
功能并会导致冲突。
示例 1。 dplyr
稍后加载,因此获胜。
library(plyr)
library(dplyr)
environment(arrange)
# <environment: namespace:dplyr>
示例 2。plyr
获胜
# unload libraries
unloadNamespace("plyr")
unloadNamespace("dplyr")
library(dplyr)
library(plyr)
environment(arrange)
关键是搜索顺序,可以通过search
函数找到。
在下面,您可以看到 plyr
出现在 dplyr
.
search()
# [1] ".GlobalEnv" "package:plyr" "package:dplyr" "tools:rstudio"
# [5] "package:stats" "package:graphics" "package:grDevices" "package:utils"
# [9] "package:datasets" "package:methods" "Autoloads" "package:base"
示例3.您可以指定要在搜索列表中加载库的位置; pos
参数。
unloadNamespace("plyr")
unloadNamespace("dplyr")
library(plyr)
library(dplyr, pos=length(search()))
environment(arrange)
# <environment: namespace:plyr>
search()
# [1] ".GlobalEnv" "package:plyr" "tools:rstudio" "package:stats"
# [5] "package:graphics" "package:grDevices" "package:utils" "package:datasets"
# [9] "package:methods" "Autoloads" "package:dplyr" "package:base"
总之,您可以加载 Bioconductor
库并提供一个大数字 pos
。
也就是说,您说 Bioconductor
取决于 S4Vector
而 S4Vector
是导致冲突的原因。不幸的是,您无法直接控制依赖包的位置,因为 require
语句在 Bioconductor
包中。
解决方法是先使用 pos
选项加载 S4Vector
,然后加载 Bioconductor
:
library(S4Vector, pos=10) # replace 10 by an appropriate large number
library(Bioconductor)
那么,S4Vector
将被放在搜索顺序的Matrix
之后。
另一种解决方案
如果你想重新加载Matrix
,那么你也可以这样做:
library(dplyr)
library(plyr)
environment(arrange)
# <environment: namespace:plyr>
unloadNamespace("dplyr")
library(dplyr)
environment(arrange)
# <environment: namespace:dplyr>