412

最近、共著者と多くのコードを共有しているようです。それらの多くは初心者/中級の R ユーザーであり、まだ持っていないパッケージをインストールする必要があることに気づいていません。

を呼び出すエレガントな方法はありinstalled.packages()ますか?

4

31 に答える 31

369

はい。パッケージのリストがある場合は、それをからの出力と比較し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)

さもないと:

コードをパッケージに入れて依存関係にすると、パッケージをインストールするときに自動的にインストールされます。

于 2010-11-03T18:13:09.153 に答える
80

次の戻り値を使用できます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

于 2013-11-09T01:00:06.247 に答える
24

このソリューションは、パッケージ名の文字ベクトルを取得して読み込みを試みるか、読み込みに失敗した場合はインストールを試みます。これを行うには、の戻り動作に依存して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" ) )
于 2013-11-08T23:20:13.147 に答える
16

シェーンの答えは本当に良いですが、私のプロジェクトの 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)
    }
}
于 2012-01-14T16:14:01.447 に答える
11
# 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)
于 2014-02-16T01:05:12.073 に答える
7

関数を使用してsetdiff、インストールされていないパッケージを取得してからインストールするだけです。以下のサンプルでは、ggplot2​​ およびRcppパッケージがインストールされているかどうかを確認してからインストールします。

unavailable <- setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages()))
install.packages(unavailable)

1 行で、上記は次のように記述できます。

install.packages(setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages())))
于 2016-02-08T08:05:58.943 に答える
7

これが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

于 2012-12-02T20:55:07.093 に答える
6

もちろん。

「インストール済みパッケージ」と「必要なパッケージ」を比較する必要があります。「保存されている既知のパッケージ」と「現在既知のパッケージ」を比較して、新しいパッケージや更新されたパッケージを判断する必要があるため、これは私がCRANberryで行っていることと非常によく似ています。

だから次のようなことをしてください

AP <- available.packages(contrib.url(repos[i,"url"]))   # available t repos[i]

既知のすべてのパッケージを取得するには、現在インストールされているパッケージを同時に呼び出し、それを特定のターゲット パッケージのセットと比較します。

于 2010-11-03T18:14:59.240 に答える
5

次の単純な関数は魅力のように機能します。

  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)  
    }

(私のものではありません。ウェブでこれを見つけて、それ以来使用していました。元のソースは不明です)

于 2015-05-17T15:34:51.583 に答える
3

私が使用するものに貢献すると思いました:

testin <- function(package){if (!package %in% installed.packages())    
install.packages(package)}
testin("packagename")
于 2016-02-04T18:46:10.943 に答える
2
 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 }
于 2015-11-07T13:36:29.253 に答える
2

「まだ持っていないライブラリをインストールする」という主な目的に関して、「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")

于 2013-11-11T18:32:04.783 に答える
1

以下を使用して、パッケージがインストールされているかどうかを確認し、依存関係が更新されているかどうかを確認してから、パッケージを読み込みます。

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, ])
}
于 2012-12-02T15:24:20.743 に答える
1
library <- function(x){
  x = toString(substitute(x))
if(!require(x,character.only=TRUE)){
  install.packages(x)
  base::library(x,character.only=TRUE)
}}

これは引用符で囲まれていないパッケージ名で機能し、かなりエレガントです(GeoObserverの回答を参照)

于 2016-08-26T17:47:53.753 に答える