如何在不重复重复输入require命令的情况下一次加载一堆包?我尝试了三种方法,所有这些方法都会崩溃并烧毁.
基本上,我想为一个将加载它们的函数提供包名称的向量.
x<-c("plyr", "psych", "tm")
require(x)
lapply(x, require)
do.call("require", x)
Run Code Online (Sandbox Code Playgroud) 我有一个R脚本,与不同计算机上的多个用户共享.其中一行包含install.packages("xtable")
命令.
问题是,每次有人运行脚本时,R都会花费大量时间显然重新安装软件包(实际上确实需要一些时间,因为实际案例中有几个软件包的向量).
如何首先检查软件包是否已安装,然后仅install.packages()
针对那些软件包运行?
我正在尝试编写一组函数来检查缺少的R包,并在必要时安装它们.在StackOverflow上有一些很好的代码:从这里开始.
我想让函数尽可能保持沉默,特别是因为R甚至以红色墨水返回成功的消息.因此,我试图将quietly = TRUE
论证传递给两者library
和require
.
但是,这些选项似乎永远不会起作用:
# attempt to get a silent fail
require(xyz, quietly = TRUE)
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, :
there is no package called ‘xyz’
Run Code Online (Sandbox Code Playgroud)
我如何能够require
默默地失败,以及我没有得到关于该quietly
选项的内容?
文件说:
quietly
合乎逻辑的.如果为TRUE,则不会打印确认包装载的消息,并且通常,如果包装加载失败,则不会打印错误/警告.
但在我个人的经历中,"我经常"应该"几乎从不".我很高兴听到你的经历.理由:编码功能,以帮助学生.
加.同样的问题适用quiet = TRUE
于install.packages()
.它只会杀死进度条,但不会删除随后出现的"下载的二进制包都在"消息(黑色,黑色!),即使它对中位用户没用.
加.如果这可能是任何人都感兴趣,到目前为止的代码:
## getPackage(): package loader/installer
getPackage <- function(pkg, load = TRUE, silent = FALSE, repos = "http://cran.us.r-project.org") { …
Run Code Online (Sandbox Code Playgroud) 我在R中使用了几个软件包,但是我在一台机器上运行脚本,可能已经安装了部分/全部软件包,也可能没有.
这些软件包zoo
,quantmod
,data.table
,...,和一堆了.
这是我尝试过的:有没有办法检查是否安装了这些软件包,如果没有安装它?我不希望R浪费时间重新安装已经存在的任何软件包.
这是我尝试过的:
pckg = c("zoo", "tseries", "quantmod", "MASS", "graphics", "plyr", "data.table", "gridExtra")
is.installed <- function(mypkg){
is.element(mypkg, installed.packages()[,1])
}
for(i in 1:length(pckg)) {
if (!is.installed(pckg[i])){
install.packages(pckg[i])
}
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?
另外,我需要为安装自动设置镜像.我不知道该怎么做.
谢谢!
根据这个问题的答案:优雅的方法来检查丢失的包并安装它们?
我正在使用以下代码来确保在升级R或安装其他用户时安装所有软件包:
list.of.packages <- c("RODBC", "reshape2", "plyr")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)
Run Code Online (Sandbox Code Playgroud)
我已将它放在我的.Rprofile中的myFirst函数中,但是当我启动R时它会出现以下错误并继续启动:
Error in match(x, table, nomatch = 0L) :
could not find function "installed.packages"
Run Code Online (Sandbox Code Playgroud)
如果我在得到提示后运行代码它可以正常工作.有什么想法吗?
谢谢!
建议包开发人员检查用户是否安装了包的典型方法如下:
if (!requireNamespace("package")) {
stop("Please install package.")
}
Run Code Online (Sandbox Code Playgroud)
requireNamespace
加载包(在当前范围内?)并返回 TRUE/FALSE 值。我需要在不加载命名空间的情况下检查包的安装状态。
这样做的原因是因为我正在编写一个knit_print
S3 方法(扩展knitr
包),并且我正在检查的命名空间在我的方法上下文之外有我想要避免的kableExtra
副作用。knit_print
加载后,kableExtra
会更改后续调用knitr::kable
在全局级别的格式化方式。这样做有充分的理由,但我想在我的 S3 方法内部使用kableExtra
,并且不要让最终用户对调用kable
我的方法后行为不同的原因感到困惑。knit_print
这就是为什么我想在不加载命名空间的情况下检查命名空间(如果kableExtra
未安装,只需调用knitr::normal_print
)。
编辑:为了澄清为什么我不认为这是这个问题的重复,这些答案没有特别注意解决方案在安装时是否加载包。事实证明,有些解决方案没有加载有问题的包,但它们没有明显区分。
我对R编程很新.我正在尝试自定义我的R设置,以便在启动R会话时,在开始时安装几个包.我知道我可以在Rprofile.site文件中编写一个.First()函数.但是,在.First()函数中添加我的安装包代码后,包不会安装.
此外,它似乎进入一个尝试创建包的循环,它在R中的库文件夹中创建一个锁定文件.这导致我的计算机真的变慢(几乎到它被冻结的程度),因为它一直在尝试安装该包.
这是我添加到Rprofile.site文件末尾的代码.
.First <- function() {
install.packages("customPackage.tar.gz", repos=NULL, type="source")
cat("\nWelcome to R on ", date(), "\n")
}
Run Code Online (Sandbox Code Playgroud)
我甚至尝试在文件中单独添加install.packages行(没有.First()函数)无济于事.
customPackage.tar.gz是指我使用我编写的现有代码构建的包.由于这是一个自定义包,因此repos为NULL.如果我没有在我的.First()函数中包含这一行,并且只是在启动R会话后运行该命令,则该软件包在R/R-2.15.0/library文件夹中安装得很好.
我需要在R会话开始时安装几个自定义程序包,这就是为什么在Rprofile.site文件中添加所有这些代码安装行很重要的原因.有关如何做到这一点的任何想法?我在网上看到的每个地方都定制了Rprofile.site文件,显示了仅使用已存在的库的示例(例如,库(R2HTML)),但没有用于安装新库的示例.谢谢您的帮助!
编辑:谢谢你的帮助!实际上,我确实需要为每个用户在多台机器上安装这些软件包,而不是让它们手动安装软件包一次,我认为在网站文件中做这件事会很好.我试过Justin的建议,先检查包装,然后才有效!再次感谢您的帮助!
library(proto)
library(gsubfn)
library(tidyr)
library(dplyr)
library(ggplot2)
library(stringr)
library(magrittr)
library(usmap)
library(RCurl)
library(RJSONIO)
library(sqldf)
Run Code Online (Sandbox Code Playgroud)
对于上面的库列表,我没有用于包安装的相应代码行。我最终在谷歌上搜索软件包名称并手动安装它们。
我很好奇当您的代码集有很长的库列表并且您不确定哪些已经安装在您的工作空间中或者只是不知道要安装哪些软件包时,安装所有必需软件包的最佳方法是什么。
你使用 require() 函数吗?如果原作者最初使用 install.package() 函数,我不确定是否要更改加载包的函数。
我想知道一种更有效的方法来安装软件包,而无需手动 google 并安装它们。
我从事一个小组项目。为了进行分析,我需要一些包。因此,为了让我的脚本在每个人的计算机上运行,我在开始时告诉 R 在所有已安装的软件包中检查所需软件包的名称,如果该名称不存在,则安装它。我的代码是:
{
ifelse("ggplot2" %in% rownames(installed.packages()),"" ,install.packages("ggplot2"))
ifelse("agricolae" %in% rownames(installed.packages()),"" ,install.packages("agricolae"))
ifelse("lattice" %in% rownames(installed.packages()),"" ,install.packages("lattice"))
ifelse("DescTools" %in% rownames(installed.packages()),"" ,install.packages("DescTools"))
ifelse("FSA" %in% rownames(installed.packages()),"" ,install.packages("FSA")) }
Run Code Online (Sandbox Code Playgroud)
但效果似乎不太好。例如,R 安装第一个,但不安装第二个。仅仅是因为 ggplot 太大而 R 忘记了其余的还是我还有另一个错误?
先谢谢大家了!