检查一个R包是否已经被加载

16

我的工作流程出现问题,因为我在rmarkdown中引用了多个脚本,其中一些脚本需要使用dplyr包,而另一些则需要使用plyr

问题在于,rename函数存在于两个包中,如果当前已经附加了dplyr,那么plyr中的rename函数将无法正常工作。

我该如何在我的脚本中包含一个函数,以检查是否已连接dplyr,并在连接时分离它?

我知道如何通过 detach("package:dplyr", unload = TRUE) 分离包。但我不知道如何检查包是否已连接。


4
在函数调用中明确指定可能更容易... plyr::rename - user20650
2
不要修改附加的包(这可能不是用户想要的!),而应该具体指定并使用 dplyr::renameplyr::rename - Gregor Thomas
或者更好的方法是,重构您的代码以始终使用一个版本的重命名。 - Hong Ooi
感谢@user20650 @Gregor和@Hong Ooi。好建议。这是否意味着每次函数调用都应在函数之前指定包,还是仅针对您事先知道不兼容的包执行此操作?将来我将使用data.table::setnames来重命名特定列。 - llewmills
@ Hong Ooi,当您说“重构您的代码以始终使用一个版本的重命名”时,我不知道您的意思是什么? - llewmills
2个回答

27

我认为最好的方法是使用dplyr::renameplyr::rename来明确调用你想要的函数。

但是,如果你确实想要检查一个包是否被附加并将其分离,我会使用

if("plyr" %in% (.packages())){
  detach("package:plyr", unload=TRUE) 
}

1
值得注意的是,这些包本身警告您按特定顺序加载它们。如果您先加载dplyr,然后是plyr,您会收到一个警告:
“您已在加载dplyr之后加载了plyr-这可能会导致问题。 如果您需要从plyr和dplyr中使用函数,请先加载plyr,然后再加载dplyr: library(plyr); library(dplyr)”
我的理解是,如果plyr中的函数被dplyr弃用,那么dplyr的功能将无法正常工作,但由于dplyr废弃的plyr函数实际上是更新,它们应该可以很好地协同工作。因此,请确保以正确的顺序加载它们。
library(plyr)
library(dplyr)

编辑:我重新阅读了您的问题,您的问题是dplyr对plyr函数的弃用,所以我的观点对您并不太相关,很抱歉。如果有其他人需要这些信息,我会保留它,因为它曾经让我遇到过问题:P


谢谢@rosscova。问题是我有一个rmarkdown文档,其中引用了许多不同的脚本和大量的代码,这些代码是在相当长的时间段内编写的,所以很难记住dplyr出现在哪些脚本中(以及那些脚本又引用了那些脚本)。我想这些只是通过经验学到的东西。 - llewmills

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接