这些天我似乎与共同作者分享了很多代码.他们中的许多人都是初级/中级R用户,并没有意识到他们必须安装他们尚未拥有的软件包.
是否有一种优雅的方式来调用installed.packages(),将其与我正在加载的那些进行比较并在安装时如果丢失?
如何在不重复重复输入require命令的情况下一次加载一堆包?我尝试了三种方法,所有这些方法都会崩溃并烧毁.
基本上,我想为一个将加载它们的函数提供包名称的向量.
x<-c("plyr", "psych", "tm")
require(x)
lapply(x, require)
do.call("require", x)
Run Code Online (Sandbox Code Playgroud) 我有一个非常长的R脚本,包含许多if语句和异常情况.正如我一直在进行的那样,如果我已经去过导入和测试库,并且没有真正记录它们.问题是,如果我从一个干净的安装运行它,我不确定脚本将运行哪些语句,因此需要哪些库.
我的问题是:是否有任何R函数来测试脚本中正在使用哪些库?
编辑:我没有使用所有已安装的库,因此print(sessionInfo())没有用, 但我只是想用install.packages函数启动脚本
我们的R脚本用于多台计算机上的多个用户,因此每台计算机上都安装了软件包.为了确保每个脚本都适用于所有用户,我想定义一个函数pkgLoad,它将首先测试是否在本地安装软件包,然后再使用抑制的启动消息加载库.在运行install.packages()作为指南之前使用Check for installed packages,我试过了
pkgLoad <- function(x)
{
if (!require(x,character.only = TRUE))
{
install.packages(x,dep=TRUE, repos='http://star-www.st-andrews.ac.uk/cran/')
if(!require(x,character.only = TRUE)) stop("Package not found")
}
#now load library and suppress warnings
suppressPackageStartupMessages(library(x))
library(x)
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用pkgLoad("ggplot2")加载ggplot2时,我在终端中收到以下错误消息
Error in paste("package", package, sep = ":") :
object 'ggplot2' not found
> pkgLoad("ggplot2")
Loading required package: ggplot2
Error in library(x) : there is no package called ‘x’
> pkgLoad("ggplot2")
Error in library(x) : there is no package called ‘x’
Run Code Online (Sandbox Code Playgroud)
为什么x从ggplot2变为普通的旧x?
建议包开发人员检查用户是否安装了包的典型方法如下:
if (!requireNamespace("package")) {
stop("Please install package.")
}
Run Code Online (Sandbox Code Playgroud)
requireNamespace加载包(在当前范围内?)并返回 TRUE/FALSE 值。我需要在不加载命名空间的情况下检查包的安装状态。
这样做的原因是因为我正在编写一个knit_printS3 方法(扩展knitr包),并且我正在检查的命名空间在我的方法上下文之外有我想要避免的kableExtra副作用。knit_print
加载后,kableExtra会更改后续调用knitr::kable在全局级别的格式化方式。这样做有充分的理由,但我想在我的 S3 方法内部使用kableExtra,并且不要让最终用户对调用kable我的方法后行为不同的原因感到困惑。knit_print
这就是为什么我想在不加载命名空间的情况下检查命名空间(如果kableExtra未安装,只需调用knitr::normal_print)。
编辑:为了澄清为什么我不认为这是这个问题的重复,这些答案没有特别注意解决方案在安装时是否加载包。事实证明,有些解决方案没有加载有问题的包,但它们没有明显区分。
使用rpy2,我想检查是否安装了给定的包.如果是,我导入它.如果没有,我先安装它.
如何检查是否已安装?
from rpy2 import *
if not *my package is installed*:
rpy2.interactive as r
r.importr("utils")
package_name = "my_package"
r.packages.utils.install_packages(package_name)
myPackage = importr("my_package")
Run Code Online (Sandbox Code Playgroud)