最近、共著者と多くのコードを共有しているようです。それらの多くは初心者/中級の R ユーザーであり、まだ持っていないパッケージをインストールする必要があることに気づいていません。
を呼び出すエレガントな方法はありinstalled.packages()
ますか?
はい。パッケージのリストがある場合は、それをからの出力と比較しinstalled.packages()[,"Package"]
、不足しているパッケージをインストールします。このようなもの:
list.of.packages <- c("ggplot2", "Rcpp")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)
さもないと:
コードをパッケージに入れて依存関係にすると、パッケージをインストールするときに自動的にインストールされます。
次の戻り値を使用できますrequire
。
if(!require(somepackage)){
install.packages("somepackage")
library(somepackage)
}
library
インストールが成功しなかった場合、または他の理由でパッケージをロードできない場合に例外がスローされるため、インストール後に使用します。これをより堅牢で再利用可能にします。
dynamic_require <- function(package){
if(eval(parse(text=paste("require(",package,")")))) return True
install.packages(package)
return eval(parse(text=paste("require(",package,")")))
}
この方法の欠点は、パッケージ名を引用符で囲んで渡す必要があることですrequire
。
このソリューションは、パッケージ名の文字ベクトルを取得して読み込みを試みるか、読み込みに失敗した場合はインストールを試みます。これを行うには、の戻り動作に依存してrequire
います...
require
必要なパッケージが利用可能かどうかを示す論理を (目に見えないように) 返します
したがって、必要なパッケージをロードできたかどうかを簡単に確認できます。そうでない場合は、依存関係とともにインストールします。したがって、読み込みたいパッケージの文字ベクトルが与えられます...
foo <- function(x){
for( i in x ){
# require returns TRUE invisibly if it was able to load package
if( ! require( i , character.only = TRUE ) ){
# If package was not able to be loaded then re-install
install.packages( i , dependencies = TRUE )
# Load package after installing
require( i , character.only = TRUE )
}
}
}
# Then try/install packages...
foo( c("ggplot2" , "reshape2" , "data.table" ) )
シェーンの答えは本当に良いですが、私のプロジェクトの 1 つで、出力メッセージ、警告を削除し、パッケージを自動的にインストールする必要がありました。私は最終的にこのスクリプトを取得することができました:
InstalledPackage <- function(package)
{
available <- suppressMessages(suppressWarnings(sapply(package, require, quietly = TRUE, character.only = TRUE, warn.conflicts = FALSE)))
missing <- package[!available]
if (length(missing) > 0) return(FALSE)
return(TRUE)
}
CRANChoosen <- function()
{
return(getOption("repos")["CRAN"] != "@CRAN@")
}
UsePackage <- function(package, defaultCRANmirror = "http://cran.at.r-project.org")
{
if(!InstalledPackage(package))
{
if(!CRANChoosen())
{
chooseCRANmirror()
if(!CRANChoosen())
{
options(repos = c(CRAN = defaultCRANmirror))
}
}
suppressMessages(suppressWarnings(install.packages(package)))
if(!InstalledPackage(package)) return(FALSE)
}
return(TRUE)
}
使用する:
libraries <- c("ReadImages", "ggplot2")
for(library in libraries)
{
if(!UsePackage(library))
{
stop("Error!", library)
}
}
# List of packages for session
.packages = c("ggplot2", "plyr", "rms")
# Install CRAN packages (if not already installed)
.inst <- .packages %in% installed.packages()
if(length(.packages[!.inst]) > 0) install.packages(.packages[!.inst])
# Load packages into session
lapply(.packages, require, character.only=TRUE)
関数を使用してsetdiff
、インストールされていないパッケージを取得してからインストールするだけです。以下のサンプルでは、ggplot2
およびRcpp
パッケージがインストールされているかどうかを確認してからインストールします。
unavailable <- setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages()))
install.packages(unavailable)
1 行で、上記は次のように記述できます。
install.packages(setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages())))
これがrbundler パッケージの目的です: 特定のプロジェクト用にインストールされたパッケージを制御する方法を提供することです。現在、パッケージは devtools 機能と連携して、プロジェクトのディレクトリにパッケージをインストールします。機能は Ruby のbundlerに似ています。
プロジェクトがパッケージの場合 (推奨)、必要なことは rbundler をロードしてパッケージをバンドルすることだけです。このbundle
関数は、パッケージのDESCRIPTION
ファイルを調べて、バンドルするパッケージを決定します。
library(rbundler)
bundle('.', repos="http://cran.us.r-project.org")
これで、パッケージが .Rbundle ディレクトリにインストールされます。
DESCRIPTION
プロジェクトがパッケージでない場合は、プロジェクトのルート ディレクトリにファイルを作成して、インストールするパッケージを一覧表示する Depends フィールド (オプションのバージョン情報を含む) を作成することで、それを偽造できます。
Depends: ggplot2 (>= 0.9.2), arm, glmnet
貢献に興味がある場合は、プロジェクトの github リポジトリを次に示します: rbundler。
もちろん。
「インストール済みパッケージ」と「必要なパッケージ」を比較する必要があります。「保存されている既知のパッケージ」と「現在既知のパッケージ」を比較して、新しいパッケージや更新されたパッケージを判断する必要があるため、これは私がCRANberryで行っていることと非常によく似ています。
だから次のようなことをしてください
AP <- available.packages(contrib.url(repos[i,"url"])) # available t repos[i]
既知のすべてのパッケージを取得するには、現在インストールされているパッケージを同時に呼び出し、それを特定のターゲット パッケージのセットと比較します。
次の単純な関数は魅力のように機能します。
usePackage<-function(p){
# load a package if installed, else load after installation.
# Args:
# p: package name in quotes
if (!is.element(p, installed.packages()[,1])){
print(paste('Package:',p,'Not found, Installing Now...'))
install.packages(p, dep = TRUE)}
print(paste('Loading Package :',p))
require(p, character.only = TRUE)
}
(私のものではありません。ウェブでこれを見つけて、それ以来使用していました。元のソースは不明です)
私が使用するものに貢献すると思いました:
testin <- function(package){if (!package %in% installed.packages())
install.packages(package)}
testin("packagename")
48 lapply_install_and_load <- function (package1, ...)
49 {
50 #
51 # convert arguments to vector
52 #
53 packages <- c(package1, ...)
54 #
55 # check if loaded and installed
56 #
57 loaded <- packages %in% (.packages())
58 names(loaded) <- packages
59 #
60 installed <- packages %in% rownames(installed.packages())
61 names(installed) <- packages
62 #
63 # start loop to determine if each package is installed
64 #
65 load_it <- function (p, loaded, installed)
66 {
67 if (loaded[p])
68 {
69 print(paste(p, "loaded"))
70 }
71 else
72 {
73 print(paste(p, "not loaded"))
74 if (installed[p])
75 {
76 print(paste(p, "installed"))
77 do.call("library", list(p))
78 }
79 else
80 {
81 print(paste(p, "not installed"))
82 install.packages(p)
83 do.call("library", list(p))
84 }
85 }
86 }
87 #
88 lapply(packages, load_it, loaded, installed)
89 }
「まだ持っていないライブラリをインストールする」という主な目的に関して、「instllaed.packages()」の使用に関係なく。次の関数は、require の元の関数をマスクします。名前付きパッケージ "x" を読み込んでチェックしようとします。インストールされていない場合は、依存関係を含めて直接インストールします。そして最後に正常にロードします。整合性を維持するために、関数名を「require」から「library」に変更します。唯一の制限は、パッケージ名を引用符で囲む必要があることです。
require <- function(x) {
if (!base::require(x, character.only = TRUE)) {
install.packages(x, dep = TRUE) ;
base::require(x, character.only = TRUE)
}
}
したがって、R の昔ながらの方法でパッケージをロードしてインストールできます。 require ("ggplot2") require ("Rcpp")
以下を使用して、パッケージがインストールされているかどうかを確認し、依存関係が更新されているかどうかを確認してから、パッケージを読み込みます。
p<-c('ggplot2','Rcpp')
install_package<-function(pack)
{if(!(pack %in% row.names(installed.packages())))
{
update.packages(ask=F)
install.packages(pack,dependencies=T)
}
require(pack,character.only=TRUE)
}
for(pack in p) {install_package(pack)}
completeFun <- function(data, desiredCols) {
completeVec <- complete.cases(data[, desiredCols])
return(data[completeVec, ])
}
library <- function(x){
x = toString(substitute(x))
if(!require(x,character.only=TRUE)){
install.packages(x)
base::library(x,character.only=TRUE)
}}
これは引用符で囲まれていないパッケージ名で機能し、かなりエレガントです(GeoObserverの回答を参照)