হারিয়ে যাওয়া প্যাকেজগুলির জন্য চেক করার এবং সেগুলি ইনস্টল করার দুর্দান্ত উপায়?


336

আমি মনে করি আজকাল প্রচুর কোডের সাথে প্রচুর কোড ভাগ করছি। তাদের মধ্যে অনেকেই নবাগত / মধ্যবর্তী আর ব্যবহারকারী এবং বুঝতে পারেন না যে তাদের কাছে ইতিমধ্যে নেই এমন প্যাকেজগুলি ইনস্টল করতে হবে।

কল করার কি কোনও সুন্দর উপায় আছে installed.packages(), আমি লোড করছি তার সাথে এটির তুলনা করুন এবং অনুপস্থিত থাকলে ইনস্টল করুন?


1
@krlmlr স্বীকৃত উত্তরটি কী পুরানো এবং তার সংশোধন প্রয়োজন? এটি আমার জন্য (কয়েকটি দ্রুত পরীক্ষার জন্য) কাজ করে R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit)
ব্রায়ান ডিগস

1
@ ব্রায়ানডিগস: কমপক্ষে তিনটি প্যাকেজ উপস্থিত হয়েছে যা এই সমস্যার সমাধান করে, কেবল নীচে একটি উল্লেখ করা হয়। আরও কি আছে - এটাই প্রশ্ন।
krlmlr

2
@krlMLr একটি প্যাকেজ ব্যবহার করার বিষয়ে (অন্যদের) প্রয়োজনীয় প্যাকেজ রয়েছে কিনা তা নিশ্চিত করার জন্য মুরগির ডিম এবং ডিম সম্পর্কিত কিছুটা সমস্যা দেখা যাচ্ছে। তবে তাদের সম্পর্কে যারা জানেন তাদের অবশ্যই উত্তর রাখা উচিত having
ব্রায়ান ডিগস

2
@ ব্রায়ানডিগস: এই ইনস্টলেশন-পরীক্ষা প্যাকেজটিকে বুটস্ট্র্যাপ করা একটি প্রয়োজনীয় উপদ্রব, তবে একটি ছোট্ট। অবশ্যই, যদি না, কার্যকারিতাটি base... ;-)
প্রবেশ করতে পারে

উত্তর:


304

হ্যাঁ. আপনার প্যাকেজগুলির তালিকা থাকলে, 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)

অন্যথায়:

আপনি যদি কোনও কোডটি কোনও প্যাকেজে রেখে দেন এবং তাদের নির্ভরতা তৈরি করেন, আপনি নিজের প্যাকেজটি ইনস্টল করার পরে সেগুলি স্বয়ংক্রিয়ভাবে ইনস্টল হয়ে যাবে।


11
আমি মনে করি সঠিক বাক্য if(length(new.packages)>0) {install.packages(new.packages)}

5
@psql, শাইন ঠিক আছে, যেহেতু "> 0" যদি এই শর্তের মধ্যে "অন্তর্ভুক্ত" থাকে। এটি যাচাই করার জন্য এটি চালান:new.packages <- c(1,2) length(new.packages) if(length(new.packages)){print("hello!")}else{print("oh no!")}
অ্যান্ড্রিয়া সিরিলো

7
ইনস্টলড.প্যাকেজের ডকটিতে বলা হয়েছে: "কয়েক হাজার প্যাকেজ ইনস্টল হয়ে গেলে এটি ধীর হতে পারে, সুতরাং নামযুক্ত প্যাকেজটি ইনস্টল করা আছে কিনা তা খুঁজে বের করার জন্য এটি ব্যবহার করবেন না (system.file বা Find.package ব্যবহার করুন)"
থমাস মাতেনা

2
থমাসের সাথে সম্মত হন, এটি requireপরীক্ষা করার পরিবর্তে আরও ভাল পারফরম্যান্স হতে পারেinstalled.packages
ম্যাথিউ

1
packratএই জন্য তৈরি করা হয়েছিল। এটি একটি পুনরুত্পাদনযোগ্য প্যাকেজ পরিচালনা সিস্টেম। এই উপায়টি এটি সম্পর্কে ভুল পথে চলেছে এবং অন্য কারও পরিবেশের সাথে জড়িত এবং প্রজননযোগ্য নয়। ভাগ করে নেওয়া লাইব্রেরিগুলির জন্য প্যাকরাটের নিজস্ব ফোল্ডার এবং পরিবেশ রয়েছে। rstudio.github.io/packrat
মেটলেশা

231

ডেসন কে এবং আমার কাছে প্যাকম্যান প্যাকেজ রয়েছে যা এটি দুর্দান্তভাবে করতে পারে। p_loadপ্যাকেজের ফাংশন এটি করে। প্রথম লাইনটি কেবল প্যাকম্যান ইনস্টল করা আছে তা নিশ্চিত করার জন্য।

if (!require("pacman")) install.packages("pacman")
pacman::p_load(package1, package2, package_n)

1
প্যাকেজের অবস্থা কী? আমি সি-আরএন-তে দেখতে পাচ্ছি না।
মেরোস

4
@ মেরোজ প্যাকম্যান এখন CRAN cr.r-project.org/web/packages/pacman/index.html
টাইলার রিঙ্কার

6
এখন ইনস্টল করেছেন এবং আশ্চর্যজনকভাবে কাজ করেন; বেসের অংশ হওয়া উচিত!
অ্যান্ডিএফ

3
এটির জন্য কেবলমাত্র এটিই ভাল হবে যদি এটি পরীক্ষা করা হয় /এবং যদি খুঁজে পাওয়া যায় তবে গিথুব থেকে স্বয়ংক্রিয়ভাবে ইনস্টল / লোড করা যায়।
এয়ারট্রাইক

4
@ নিলবার্স্চ যদি আপনি বোঝাতে চান যে if (!require("pacman")) install.packages("pacman")প্যাকম্যানে কোনও ফাংশন রয়েছে p_boot()যা আপনার জন্য স্বয়ংক্রিয়ভাবে এই লাইনটি ম্যাক করে এবং এটি ক্লিপবোর্ডে অনুলিপি করে।
টাইলার রিঙ্কার

72

আপনি কেবল এর রিটার্ন মানটি ব্যবহার করতে পারেন require:

if(!require(somepackage)){
    install.packages("somepackage")
    library(somepackage)
}

আমি libraryইনস্টলের পরে ব্যবহার করি কারণ এটি ইনস্টলটি সফল না হলে বা অন্য কোনও কারণে প্যাকেজটি লোড করা না গেলে এটি একটি ব্যতিক্রম ছুঁড়ে দেবে। আপনি এটিকে আরও দৃust় এবং পুনঃব্যবহারযোগ্য করে তুলেছেন:

dynamic_require <- function(package){
  if(eval(parse(text=paste("require(",package,")")))) return True

  install.packages(package)
  return eval(parse(text=paste("require(",package,")")))
}

এই পদ্ধতির খারাপ দিকটি হ'ল আপনাকে প্যাকেজের নামটি উদ্ধৃতিতে দিতে হবে, যা আপনি বাস্তবের জন্য করেন না require


4
ব্যবহার করে আপনি আপনার জীবনে অনেক প্রক্রিয়া সহজ করতে character.only = TRUErequire, কিন্তু তারপর আমি খনি থেকে আপনার উত্তর পার্থক্য কিছুই নেই।
সাইমন ও'হানলন

এটি দেখতে দুর্দান্ত লাগছে তবে এটি কাজ করে না বলে মনে হচ্ছে, কমপক্ষে আমার পক্ষে। আমি যখন এর শক্তিশালী সংস্করণটি চেষ্টা করেছি তখন আমি দুটি ত্রুটি বার্তা পেয়েছি কারণ আর কোনও কারণে "রিটার্ন ট্রু" এবং "রিটার্ন ইভাল" কীভাবে পরিচালনা করতে হয় তা জানে না। সুতরাং আমি সত্যিই এর মতো একটি ফাংশন চাই যা আমার লাইব্রেরিতে উপস্থিত থাকলে একটি প্যাকেজ লোড করে এবং অন্যথায় প্যাকেজটি ইনস্টল করে (এবং পরে লোড করে)। আদর্শভাবে আমি প্যাকেজগুলি লোড করার জন্য এটি ডিফল্ট হিসাবে ব্যবহার করব। কমপক্ষে মনে হচ্ছে এটি করার অর্থ হবে এবং কিছুটা সময় সাশ্রয় হবে।
ফ্যাবিয়ান হ্যাবারস্যাক

23
if (!require('ggplot2')) install.packages('ggplot2'); library('ggplot2')

"ggplot2" হ'ল প্যাকেজ। এটি প্যাকেজ ইনস্টল করা আছে কিনা তা পরীক্ষা করে দেখুন, এটি যদি এটি ইনস্টল না করে। এটি এর পরে কোন শাখা নিয়েছে তা নির্বিশেষে প্যাকেজটি লোড করে।


21

এই সমাধানটি প্যাকেজের নামগুলির একটি চরিত্রের ভেক্টর নেবে এবং সেগুলি লোড করার চেষ্টা করবে, বা লোড ব্যর্থ হলে এগুলি ইনস্টল করবে। এটি এটি করার ফিরতি আচরণের উপর নির্ভর করে 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" ) )

requireইনস্টল করার পরে আপনি আবার কল করতে চান না ?
krlmlr

@krlmlr নাহ, কারণ ifবিবৃতিটি মূল্যায়নের জন্য প্রথমে এটি অবশ্যই মূল্যায়ন করতে হবে , পজাগুলি উপলব্ধ থাকলে requireএর পার্শ্ব-প্রতিক্রিয়াটি!
সাইমন ও'হানলন

1
সাইমনও 101: আমি মনে করি krlmlr এর অর্থ হল if স্টেটমেন্টে, কল করার পরে install.packages, কারণ এটি আসলে সেই প্যাকেজটি লোড করবে না। তবে (@ কেআরএলএমএমএল) আমি সন্দেহ করি উদ্দেশ্যটি হ'ল এই কোডটি খণ্ডটি কেবল একবার কল করা হবে; আপনি যখনই প্যাকেজের প্রয়োজন হবে তখন আপনি এটি লিখবেন না। পরিবর্তে আপনি এটি সময়ের আগে একবার চালাবেন এবং তারপরে requireপ্রয়োজনীয় হিসাবে কল করুন ।
হারুন

@ অ্যারন আহ হ্যাঁ ঠিক আছে, আমি আপনাকে বোঝাতে চাইছি এবং হ্যাঁ আপনার ব্যাখ্যাটি সঠিক। ইনস্টলের পরে লোড সম্পর্কে আরও সুস্পষ্ট হতে আমি এটি সামান্য সম্পাদনা করব।
সাইমন ও'হানলন

1
এটি যদি দ্বিতীয় কারণে requireকল করতে libraryপারা যায় তবে এটি যদি কোনও কারণে প্যাকেজটি সংযুক্ত করতে অক্ষম হয় তবে এটি উচ্চস্বরে ব্যর্থ হয়?
কাবদুল্লা

18

উপরের অনেকগুলি উত্তর (এবং এই প্রশ্নের সদৃশগুলিতে) নির্ভর করে installed.packagesযা খারাপ ফর্ম। ডকুমেন্টেশন থেকে:

কয়েক হাজার প্যাকেজ ইনস্টল হওয়ার পরে এটি ধীর হতে পারে, সুতরাং নামযুক্ত প্যাকেজ ইনস্টল করা আছে কিনা তা জানতে এটি ব্যবহার করবেন না (system.file বা Find.package ব্যবহার করুন) অথবা প্যাকেজ ব্যবহারযোগ্য কিনা তা জানতে (কল প্রয়োজন এবং চেক পরীক্ষা করুন) রিটার্ন মান) বা অল্প সংখ্যক প্যাকেজের বিশদ সন্ধান করতে (প্যাকেজডেস্ক্রিপশন ব্যবহার করুন)। এটি ইনস্টল করা প্যাকেজ প্রতি বেশ কয়েকটি ফাইল পড়তে হবে যা উইন্ডোজ এবং কিছু নেটওয়ার্ক-মাউন্ট করা ফাইল সিস্টেমে ধীর হবে।

সুতরাং, আরও ভাল পন্থাটি হ'ল প্যাকেজটি লোড করার চেষ্টা করা requireএবং লোডিং ব্যর্থ হলে ইনস্টল করা ( এটি পাওয়া না গেলে requireফিরে আসবে FALSE)। আমি এই বাস্তবায়ন পছন্দ করি:

using<-function(...) {
    libs<-unlist(list(...))
    req<-unlist(lapply(libs,require,character.only=TRUE))
    need<-libs[req==FALSE]
    if(length(need)>0){ 
        install.packages(need)
        lapply(need,require,character.only=TRUE)
    }
}

যা এটির মতো ব্যবহার করা যেতে পারে:

using("RCurl","ggplot2","jsonlite","magrittr")

এইভাবে এটি সমস্ত প্যাকেজ লোড করে, তারপরে ফিরে গিয়ে সমস্ত অনুপস্থিত প্যাকেজ ইনস্টল করে (যা আপনি চাইলে ব্যবহারকারী প্যাকেজগুলি ইনস্টল করতে চান কিনা তা জিজ্ঞাসা করার জন্য একটি প্রম্পট toোকানো একটি সহজ জায়গা)। install.packagesপ্রতিটি প্যাকেজের জন্য আলাদাভাবে কল করার পরিবর্তে এটি আনইনস্টল করা প্যাকেজগুলির পুরো ভেক্টরটিকে কেবল একবারই পাস করে।

এখানে একই ফাংশনটি রয়েছে তবে উইন্ডোজ সংলাপের সাহায্যে জিজ্ঞাসা করা হয়েছে যে ব্যবহারকারী অনুপস্থিত প্যাকেজগুলি ইনস্টল করতে চান কিনা

using<-function(...) {
    libs<-unlist(list(...))
    req<-unlist(lapply(libs,require,character.only=TRUE))
    need<-libs[req==FALSE]
    n<-length(need)
    if(n>0){
        libsmsg<-if(n>2) paste(paste(need[1:(n-1)],collapse=", "),",",sep="") else need[1]
        print(libsmsg)
        if(n>1){
            libsmsg<-paste(libsmsg," and ", need[n],sep="")
        }
        libsmsg<-paste("The following packages could not be found: ",libsmsg,"\n\r\n\rInstall missing packages?",collapse="")
        if(winDialog(type = c("yesno"), libsmsg)=="YES"){       
            install.packages(need)
            lapply(need,require,character.only=TRUE)
        }
    }
}

এটি একটি দুর্দান্ত মার্জিত উপায়, গ্রহণযোগ্যতার চেয়ে অনেক ভাল। আমি এটি আমার ব্যক্তিগত গ্রন্থাগারে অন্তর্ভুক্ত করব। ধন্যবাদ।
বিং

15

যদিও শেনের উত্তরটি সত্যিই ভাল, আমার একটি প্রকল্পের জন্য আমাকে আউটপুট বার্তা, সতর্কতা এবং প্যাকেজগুলি স্বয়ংক্রিয়ভাবে ইনস্টল করতে হবে । অবশেষে আমি এই স্ক্রিপ্টটি পেতে পেরেছি:

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

9
# 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)

6

এটি rbundler প্যাকেজটির উদ্দেশ্য : নির্দিষ্ট প্রকল্পের জন্য ইনস্টল হওয়া প্যাকেজগুলি নিয়ন্ত্রণ করার একটি উপায় সরবরাহ করা। এখনই প্যাকেজটি আপনার প্রকল্পের ডিরেক্টরিতে প্যাকেজ ইনস্টল করতে ডিভলটোল কার্যকারিতা নিয়ে কাজ করে। কার্যকারিতা রুবির বান্ডিলারের অনুরূপ ।

যদি আপনার প্রকল্পটি একটি প্যাকেজ (প্রস্তাবিত) হয় তবে আপনাকে যা করতে হবে তা হ'ল rbundler লোড করুন এবং প্যাকেজগুলি বান্ডিল করুন। bundleফাংশন আপনার প্যাকেজ এর এ দেখবে DESCRIPTIONফাইল নির্ধারণ করতে যা প্যাকেজ বান্ডেল করতে।

library(rbundler)
bundle('.', repos="http://cran.us.r-project.org")

এখন প্যাকেজগুলি .Rbundle ডিরেক্টরিতে ইনস্টল করা হবে।

যদি আপনার প্রকল্পটি কোনও প্যাকেজ না হয়ে থাকে তবে আপনি DESCRIPTIONআপনার প্রকল্পের মূল ডিরেক্টরিতে একটি নির্ভরশীল ক্ষেত্রের সাহায্যে ফাইল ইনস্টল করে এটি নকল করতে পারেন যা আপনার ইনস্টল করতে চান এমন প্যাকেজগুলি তালিকাভুক্ত করে ((চ্ছিক সংস্করণ তথ্য সহ):

Depends: ggplot2 (>= 0.9.2), arm, glmnet

আপনি যদি অবদান রাখতে আগ্রহী হন তবে প্রকল্পের গিথুব রেপো এখানে রয়েছে: rbundler


5

অবশ্যই।

আপনার পছন্দসই প্যাকেজগুলির সাথে 'ইনস্টল করা প্যাকেজগুলি' তুলনা করতে হবে। নতুন এবং / অথবা আপডেট হওয়া প্যাকেজ নির্ধারণ করতে আমার 'বর্তমানে পরিচিত প্যাকেজগুলি' 'বর্তমানে পরিচিত প্যাকেজগুলি' এর সাথে তুলনা করা প্রয়োজন বলে ক্র্যানবেরিগুলির সাথে আমি যা করি তার খুব কাছাকাছি ।

তাই কিছু করতে

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

সমস্ত পরিচিত প্যাকেজ পেতে, বর্তমানে ইনস্টল করা প্যাকেজগুলির জন্য একক কল এবং এটি নির্দিষ্ট প্যাকেজগুলির একটি সেটের সাথে তুলনা করে।


5

ব্যবহার করুন packratযাতে ভাগ করা লাইব্রেরিগুলি একই রকম হয় এবং অন্যের পরিবেশ পরিবর্তন না করে changing

কমনীয়তা এবং সর্বোত্তম অনুশীলনের ক্ষেত্রে আমি মনে করি আপনি মৌলিকভাবে এটি ভুল পথে চলেছেন। packratএই সমস্যাগুলির জন্য প্যাকেজটি তৈরি করা হয়েছিল। এটি আরডিস্টুডিও হ্যাডলি উইকহাম দ্বারা তৈরি করেছেন। তাদের পরিবর্তে নির্ভরতা ইনস্টল করতে হবে এবং কারওর পরিবেশ ব্যবস্থা সম্ভবত বিশৃঙ্খলা সৃষ্টি করতে হবে, packratতার নিজস্ব ডিরেক্টরি ব্যবহার করে এবং সেখানে আপনার প্রোগ্রামগুলির জন্য সমস্ত নির্ভরতা ইনস্টল করে এবং কারও পরিবেশকে স্পর্শ করে না।

প্যাক্র্যাট আর এর জন্য নির্ভরতা পরিচালন ব্যবস্থা is

প্যাকেজ নির্ভরতা হতাশ হতে পারে। অন্য কারও কোডটি কাজ করতে আপনাকে কী আর প্যাকেজ ইনস্টল করতে হবে তা নির্ধারণের জন্য কি কখনও ট্রায়াল-অ্যান্ড ত্রুটি ব্যবহার করতে হয়েছিল – এবং সেই প্যাকেজগুলি বিশ্বব্যাপী চিরতরে ইনস্টল করা হয়েছে, কারণ এখন আপনি নিশ্চিত হন না যে এগুলি আপনার দরকার কিনা whether ? কাজ করার জন্য আপনি কি কোনও প্রকল্পের কোড পাওয়ার জন্য কোনও প্যাকেজ আপডেট করেছেন, কেবলমাত্র এই আপডেট প্যাকেজটি অন্য কোনও প্রকল্পের কোড কাজ বন্ধ করে দেয় তা সন্ধান করতে?

আমরা এই সমস্যাগুলি সমাধানের জন্য প্যাক্র্যাট তৈরি করেছি। আপনার আর প্রকল্পগুলি আরও তৈরি করতে প্যাক্র্যাট ব্যবহার করুন:

  • বিচ্ছিন্ন: একটি প্রকল্পের জন্য নতুন বা আপডেট হওয়া প্যাকেজ ইনস্টল করা আপনার অন্যান্য প্রকল্পগুলিকে ভেঙে ফেলবে না এবং বিপরীতে। কারণ প্যাক্র্যাট প্রতিটি প্রকল্পের নিজস্ব ব্যক্তিগত প্যাকেজ লাইব্রেরি দেয়।
  • পোর্টেবল: আপনার প্রকল্পগুলি সহজেই একটি কম্পিউটার থেকে অন্য কম্পিউটারে পরিবহন করা যায়, এমনকি বিভিন্ন প্ল্যাটফর্ম জুড়ে। আপনার প্রকল্পের উপর নির্ভর করে প্যাকেটগুলি প্যাকেজগুলি ইনস্টল করা সহজ করে তোলে।
  • পুনরুত্পাদনযোগ্য: প্যাক্র্যাট আপনার উপর নির্ভর করে নিখুঁত প্যাকেজ সংস্করণগুলি রেকর্ড করে এবং নিশ্চিত করে যে আপনি যেখানেই যান ঠিক সেই সংস্করণগুলি ইনস্টল হয়ে যায়।

https://rstudio.github.io/packrat/


4

নিম্নলিখিত সহজ ফাংশন একটি কবজ মত কাজ করে:

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

(আমার নয়, কিছুদিন আগে ওয়েবে এটি পাওয়া গেছে এবং তখন থেকেই এটি ব্যবহার করা হচ্ছে। মূল উত্স সম্পর্কে নিশ্চিত নন)


4

আমি প্যাকেজ ইনস্টল করতে নিম্নলিখিত ফাংশনটি ব্যবহার করি যদি require("<package>")প্যাকেজ সহ প্রস্থান হয় ত্রুটি না পাওয়া যায়। এটি প্যাকেজের অনুপস্থিতির জন্য CRAN এবং বায়োকন্ডাক্টর সংগ্রহস্থল উভয়েরই জিজ্ঞাসা করবে।

জোশুয়া উইলির মূল কাজ থেকে রূপান্তরিত,

install.packages.auto <- function(x) { 
  x <- as.character(substitute(x)) 
  if(isTRUE(x %in% .packages(all.available=TRUE))) { 
    eval(parse(text = sprintf("require(\"%s\")", x)))
  } else { 
    #update.packages(ask= FALSE) #update installed packages.
    eval(parse(text = sprintf("install.packages(\"%s\", dependencies = TRUE)", x)))
  }
  if(isTRUE(x %in% .packages(all.available=TRUE))) { 
    eval(parse(text = sprintf("require(\"%s\")", x)))
  } else {
    source("http://bioconductor.org/biocLite.R")
    #biocLite(character(), ask=FALSE) #update installed packages.
    eval(parse(text = sprintf("biocLite(\"%s\")", x)))
    eval(parse(text = sprintf("require(\"%s\")", x)))
  }
}

উদাহরণ:

install.packages.auto(qvalue) # from bioconductor
install.packages.auto(rNMF) # from CRAN

PS: update.packages(ask = FALSE)& biocLite(character(), ask=FALSE)সিস্টেমে ইনস্টল করা সমস্ত প্যাকেজ আপডেট করবে। এটি একটি দীর্ঘ সময় নিতে পারে এবং এটি একটি সম্পূর্ণ আর্ট আপগ্রেড হিসাবে বিবেচনা করতে পারে যা সর্বদা warranted নাও হতে পারে!


প্যাকেজগুলি ক্র্যান বা বিসি-তে আসলে উপলভ্য কিনা তা পরীক্ষা করে এটি উন্নত করা যেতে পারে। এছাড়াও ইনস্টলেশনটি ব্যর্থ হলে বা কোনও প্যাকেজ উপস্থিত না থাকলে ত্রুটি ছুঁড়তে শেষে লাইব্রেরিটি ব্যবহার করা উচিত। আমার উন্নত সংস্করণ নামক দেখুন loadpack()উপর raw.githubusercontent.com/holgerbrandl/datautils/master/R/...
হোলগার Brandl

4

setdiffইনস্টল না থাকা প্যাকেজগুলি পাওয়ার জন্য আপনি সহজেই ফাংশনটি ব্যবহার করতে পারেন এবং সেগুলি ইনস্টল করুন। নমুনা নীচে, আমরা যদি পরীক্ষা ggplot2এবং Rcppপ্যাকেজ তাদের ইনস্টল করার পূর্বে ইনস্টল করা নেই।

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

এক লাইনে উপরেরগুলি এইভাবে লেখা যেতে পারে:

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

আমি একই পদ্ধতির ব্যবহার। আমরা installed.packages()[,'Package']পরিবর্তে ব্যবহার করতে পারেন rownames(installed.packages())
স্কুডেলেটি 23'17

3

আমি নিঃশব্দে প্রয়োজনীয় আর প্যাকেজ ইনস্টল ও লোড করতে ফাংশনটি বাস্তবায়ন করেছি। আশা করি সাহায্য করতে পারে। কোডটি এখানে:

# Function to Install and Load R Packages
Install_And_Load <- function(Required_Packages)
{
    Remaining_Packages <- Required_Packages[!(Required_Packages %in% installed.packages()[,"Package"])];

    if(length(Remaining_Packages)) 
    {
        install.packages(Remaining_Packages);
    }
    for(package_name in Required_Packages)
    {
        library(package_name,character.only=TRUE,quietly=TRUE);
    }
}

# Specify the list of required packages to be installed and load    
Required_Packages=c("ggplot2", "Rcpp");

# Call the Function
Install_And_Load(Required_Packages);

3

আর স্টুডিও (1.2) এর আসন্ন সংস্করণ, পূর্বরূপ হিসাবে ইতিমধ্যে উপলব্ধ, এর মধ্যে থাকা library()এবং require()কলগুলিতে হারিয়ে যাওয়া প্যাকেজগুলি সনাক্ত করার জন্য একটি বৈশিষ্ট্য অন্তর্ভুক্ত করবে এবং তাদের ইনস্টল করার জন্য ব্যবহারকারীকে অনুরোধ করবে:

অনুপস্থিত আর প্যাকেজগুলি সনাক্ত করুন

অনেক R স্ক্রিপ্ট কল খুলতে library()এবং require()প্যাকেজ তারা চালানো প্রয়োজন লোড করা হয়নি। আপনি যদি কোনও আর স্ক্রিপ্ট খোলেন যা আপনার ইনস্টল করা হয়নি এমন প্যাকেজগুলিকে উল্লেখ করে, আরস্টুডিও এখন একক ক্লিকে সমস্ত প্রয়োজনীয় প্যাকেজ ইনস্টল করার প্রস্তাব দেবে। install.packages()ত্রুটিগুলি না যাওয়া পর্যন্ত বার বার আর টাইপ করা হবে না!
https://blog.rstudio.com/2018/11/19/rstudio-1-2-preview-the-little-things/

এটি বিশেষত ওপি-র মূল উদ্বেগকে মোকাবেলায় বলে মনে হচ্ছে:

তাদের মধ্যে অনেকেই নবাগত / মধ্যবর্তী আর ব্যবহারকারী এবং বুঝতে পারেন না যে তাদের কাছে ইতিমধ্যে নেই এমন প্যাকেজগুলি ইনস্টল করতে হবে।


2

আপনার ইতিমধ্যে "লাইব্রেরিগুলি ইনস্টল করার জন্য আপনার মূল উদ্দেশ্য সম্পর্কে" এবং "ইনস্টল্লাড.প্যাকেজ ()" নির্বিশেষে। নিম্নলিখিত ফাংশনটি প্রয়োজনীয়তার মূল ফাংশনটি মুখোশ করে। এটি নামযুক্ত প্যাকেজ "x" লোড করে পরীক্ষা করার চেষ্টা করে, এটি ইনস্টল না করা থাকলে নির্ভরতা সহ সরাসরি এটি ইনস্টল করুন; এবং সর্বশেষে এটি সাধারণভাবে লোড করুন। অখণ্ডতা বজায় রাখতে আপনি ফাংশনটির নাম 'প্রয়োজনীয়' থেকে 'লাইব্রেরি' থেকে নামকরণ করেন। একমাত্র সীমাবদ্ধতা হল প্যাকেজগুলির নাম উদ্ধৃত করা উচিত।

require <- function(x) { 
  if (!base::require(x, character.only = TRUE)) {
  install.packages(x, dep = TRUE) ; 
  base::require(x, character.only = TRUE)
  } 
}

সুতরাং আপনি আর এর পুরানো ফ্যাশন উপায়ে প্যাকেজটি লোড এবং ইনস্টল করতে পারেন ("ggplot2") প্রয়োজনীয় ("আরসিপিপি")


আপনি যদি আপনার উত্তরটি আর পছন্দ না করেন তবে তা ভাঙচুর করবেন না - কেবল এটি মুছুন।
মাইকেল পেট্রোটা

ঠিক আছে, আমি চেষ্টা করেছি, কিন্তু আমি পারিনি। আমি মনে করি আমার এফএফ-এর নোস্ক্রিপ্ট এক্সটেনশন এটি অক্ষম করছে বা আমার নিজের উত্তর মোছার অধিকার এবং ক্রেডিট নেই। এলওএল যাইহোক, আমি মনে করি লিভিয়াস আমার জবাবের একেবারে কাছাকাছি, মুখোশ না দিয়ে ভেবেছিল। ধন্যবাদ মাইকেল পেট্রোটা। বিজ্ঞপ্তি জন্য।
জিওঅবার্সার

আপনি deleteএই মন্তব্যগুলির উপরে একটি লিঙ্ক দেখতে হবে । যদি আপনি তা না করেন এবং আপনি এখনও মুছতে চান, flagলিঙ্কটি ব্যবহার করতে চান , "অন্যান্য" নির্বাচন করুন এবং কোনও মডারেটরকে ব্যাখ্যা করুন যে আপনি উত্তরটি সরিয়ে দিতে চান।
মাইকেল পেট্রোটা

2

বেশ মৌলিক।

pkgs = c("pacman","data.table")
if(length(new.pkgs <- setdiff(pkgs, rownames(installed.packages())))) install.packages(new.pkgs)

2

ভেবেছিলাম আমি যেটি ব্যবহার করব তার জন্য আমি অবদান রাখব:

testin <- function(package){if (!package %in% installed.packages())    
install.packages(package)}
testin("packagename")


2

ল্যাপ্লি পরিবার এবং বেনামে ফাংশন পদ্ধতির ব্যবহার আপনি করতে পারেন:

  1. সমস্ত তালিকাভুক্ত প্যাকেজ সংযুক্ত করার চেষ্টা করুন।
  2. অনুপস্থিত ইনস্টল করুন ( ||অলস মূল্যায়ন ব্যবহার করে )।
  3. আবার সংযুক্তি দেওয়ার চেষ্টা করুন যাঁরা পদক্ষেপ 1 এ অনুপস্থিত এবং পদক্ষেপ 2 এ ইনস্টল করেছেন।
  4. প্রতিটি প্যাকেজ চূড়ান্ত লোডের স্থিতি ( TRUE/ FALSE) মুদ্রণ করুন ।

    req <- substitute(require(x, character.only = TRUE))
    lbs <- c("plyr", "psych", "tm")
    sapply(lbs, function(x) eval(req) || {install.packages(x); eval(req)})
    
    plyr psych    tm 
    TRUE  TRUE  TRUE 

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

1

এটির জন্য আমার কোডটি এখানে:

packages <- c("dplyr", "gridBase", "gridExtra")
package_loader <- function(x){
    for (i in 1:length(x)){
        if (!identical((x[i], installed.packages()[x[i],1])){
            install.packages(x[i], dep = TRUE)
        } else {
            require(x[i], character.only = TRUE)
        }
    }
}
package_loader(packages)

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

1
library <- function(x){
  x = toString(substitute(x))
if(!require(x,character.only=TRUE)){
  install.packages(x)
  base::library(x,character.only=TRUE)
}}

এটি অব্যক্ত প্যাকেজ নামের সাথে কাজ করে এবং মোটামুটি মার্জিত (সিএফ। জিওঅবসভার এর উত্তর)


1

আমার ক্ষেত্রে, আমি একটি লাইনার চেয়েছিলাম যা আমি কমান্ডলাইন থেকে চালাতে পারি (আসলে একটি মেকফিলের মাধ্যমে)। "ভিজিএএম" এবং "পালক" ইনস্টল করার একটি উদাহরণ এখানে দেওয়া আছে যদি সেগুলি ইতিমধ্যে ইনস্টল করা না থাকে:

R -e 'for (p in c("VGAM", "feather")) if (!require(p, character.only=TRUE)) install.packages(p, repos="http://cran.us.r-project.org")'

আর এর মধ্যে থেকে এটি কেবল হবে:

for (p in c("VGAM", "feather")) if (!require(p, character.only=TRUE)) install.packages(p, repos="http://cran.us.r-project.org")

পূর্ববর্তী সমাধানের বাইরে এখানে আর কিছু নেই:

  • আমি এটি একটি লাইনে রাখি
  • আমি reposপ্যারামিটারটি হার্ড কোড করি (আয়নাটি ব্যবহার করার জন্য জিজ্ঞাসা করা কোনও পপআপ এড়ানোর জন্য)
  • আমি অন্য কোথাও ব্যবহার করার জন্য কোনও ফাংশন সংজ্ঞায়িত করতে বিরক্ত করি না

এছাড়াও গুরুত্বপূর্ণ নোট করুন character.only=TRUE(এটি ছাড়া requireপ্যাকেজটি লোড করার চেষ্টা করবে p)।


0
  packages_installed <- function(pkg_list){
        pkgs <- unlist(pkg_list)
        req <- unlist(lapply(pkgs, require, character.only = TRUE))
        not_installed <- pkgs[req == FALSE]
        lapply(not_installed, install.packages, 
               repos = "http://cran.r-project.org")# add lib.loc if needed
        lapply(pkgs, library, character.only = TRUE)
}

0

আমাকে কিছুটা উন্মাদনা শেয়ার করুন:

c("ggplot2","ggsci", "hrbrthemes", "gghighlight", "dplyr") %>%  # What will you need to load for this script?
  (function (x) ifelse(t =!(x %in% installed.packages()), 
    install.packages(x[t]),
    lapply(x, require))) 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.