প্রয়োজনীয় () এবং গ্রন্থাগার () এর মধ্যে পার্থক্য কী?


565

মধ্যে পার্থক্য কি require()এবং library()?



7
উত্তর হিসাবে এটির কোনও সংস্করণ পোস্ট করতে না চাইলে @ ইহিহির ব্লগ পোস্টে একটি লিঙ্ক যুক্ত করা হচ্ছে। yihui.name/en/2014/07/library-vs-require
MichaelChirico

4
@ ইয়িহুইয়ের ব্লগ পোস্টটির সংক্ষিপ্তসার: "মহিলারা এবং ভদ্রলোক, আমি এটি আগে বলেছি: একটি (আর) প্যাকেজ লোড করার ভুল উপায়; পরিবর্তে গ্রন্থাগার () ব্যবহার করুন"
ডি নভো

1
@ ড্যানহ্যাল ... কারণ library()তাত্ক্ষণিকভাবে উচ্চস্বরে, প্রারম্ভিক এবং প্রাসঙ্গিক ত্রুটি বার্তার সাথে ব্যর্থ হয় (প্যাকেজটি ইনস্টল না করা থাকলে বা লোড করা যায় না), তবে require()কোনও ত্রুটি বাড়ায় না, কেবল নীরবে বুলিয়ান FALSE ফিরিয়ে দেয় যা ফেলে দেওয়া হয়, এবং কোডটি পরে এবং আরও ক্রিপ্টিকভাবে Error: object “bar” not found175 লাইন ( ব্যর্থ ) দিয়ে ব্যর্থ করে
তোলে

1
@ কনরাড রুডল্ফ: হয়ে গেছে! আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ।
মার্কো

উত্তর:


85

ইতিমধ্যে দেওয়া ভাল পরামর্শ ছাড়াও, আমি এটি যুক্ত করব:

থ্রিরির প্রদত্ত লুপ যেমন কিছু ত্রুটি পরীক্ষা করে যেমন আপনি প্রত্যাবর্তন করে সেই মানটি ব্যবহার require() না করে আপনি সম্ভবত এড়ানো ভাল ।

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


356

প্রতিদিনের কাজের মধ্যে খুব একটা নেই।

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


1
# রিচিওমরিস্রোই: আপনাকে ধন্যবাদ এর অর্থ কি এই যে আমি আমার আর-কোডের একেবারে শুরুতে প্রয়োজনীয় প্যাকেজগুলি লোড করি তাতে আমি কোনটি চয়ন করি তা বিবেচ্য নয়?
মার্কো

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

45
অন্য যে কারণটি আমি ব্যবহার requireকরি তা হ'ল এটি আমাকে প্যাকেজ হিসাবে উল্লেখ করা থেকে বিরত রাখে libraries, এমন একটি অনুশীলন যা আর-কগনোসেন্টিটি প্রাচীর পর্যন্ত চালিত করে। libraryডিরেক্টরি অবস্থান যেখানে প্যাকেজ বসতে হয়।
IRTFM

22
তাদের খুব প্রাসঙ্গিক পার্থক্য রয়েছে। ব্যবহার করবেন না require, যদি না আপনি ফেরত মান পরীক্ষা করুন (এবং যে ক্ষেত্রে সাধারণত ভাল বিকল্প যেমন হয়, loadNamespace)।
কনরাড রুডল্ফ

256

এর আরেকটি সুবিধা require()হ'ল এটি ডিফল্টরূপে একটি যৌক্তিক মান প্রদান করে। TRUEপ্যাকেজগুলি লোড করা থাকলে, FALSEযদি তা না থাকে।

> test <- library("abc")
Error in library("abc") : there is no package called 'abc'
> test
Error: object 'test' not found
> test <- require("abc")
Loading required package: abc
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
  there is no package called 'abc'
> test
[1] FALSE

সুতরাং আপনি require()নীচের মত নির্মাণে ব্যবহার করতে পারেন । আপনি যদি আমাদের কোডটি আমাদের আর ইনস্টলেশনে বিতরণ করতে চান তবে প্রধানত কার্যকর কোনটি প্যাকেজগুলি ইনস্টল না করা থাকতে পারে।

if(require("lme4")){
    print("lme4 is loaded correctly")
} else {
    print("trying to install lme4")
    install.packages("lme4")
    if(require(lme4)){
        print("lme4 installed and loaded")
    } else {
        stop("could not install lme4")
    }
}

65

আপনি require()যদি প্যাকেজ ইনস্টল করতে চান এবং আপনি কেবল প্রয়োজনে ব্যবহার করতে পারেন যেমন:

if (!require(package, character.only=T, quietly=T)) {
    install.packages(package)
    library(package, character.only=T)
}

একাধিক প্যাকেজগুলির জন্য আপনি ব্যবহার করতে পারেন

for (package in c('<package1>', '<package2>')) {
    if (!require(package, character.only=T, quietly=T)) {
        install.packages(package)
        library(package, character.only=T)
    }
}

প্রো টিপস:

  • স্ক্রিপ্টের অভ্যন্তরে ব্যবহার করার সময়, আপনি যেমন reposপ্যারামিটার নির্দিষ্ট করে একটি ডায়ালগ স্ক্রিন এড়াতে পারেনinstall.packages()

    install.packages(package, repos="http://cran.us.r-project.org")
  • আপনি মোড়ানো পারেন require()এবং library()suppressPackageStartupMessages()থেকে, ভাল, দমন প্যাকেজ প্রারম্ভে বার্তা, এবং এছাড়াও প্যারামিটার ব্যবহার require(..., quietly=T, warn.conflicts=F)করে ইনস্টল শান্ত রাখা প্রয়োজন।


46

সর্বদা ব্যবহার library1 ব্যবহার কখনও না require

( 1 প্রায় কখনও না। হতে পারে ।)

সংক্ষেপে এটি হ'ল কারণ, ব্যবহার করার সময় requireআপনার কোডটি কোনও ত্রুটি সংকেত ছাড়াই ভিন্ন, ভ্রান্ত ফলাফল পেতে পারে । এটি বিরল তবে অনুমানক নয়! এই কোডটি বিবেচনা করুন, যা results dplyr load লোড করা যায় কিনা তার উপর নির্ভর করে বিভিন্ন ফলাফল দেয় :

require(dplyr)

x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)

এটি সূক্ষ্মভাবে ভুল ফলাফল হতে পারে। এখানে একটি ত্রুটি নিক্ষেপের libraryপরিবর্তে ব্যবহার করে requireকিছুটা ভুল হয়েছে তা স্পষ্টভাবে ইঙ্গিত দিয়ে। এটা ভাল

এটি অন্যান্য সমস্ত ব্যর্থতা ডিবাগিংকে আরও কঠিন করে তোলে: যদি আপনি require আপনার স্ক্রিপ্টের শুরুতে একটি প্যাকেজ ব্যবহার করেন এবং এর রফতানি 500 লাইনে ব্যবহার করেন, তবে 500 এর লাইনে একটি ত্রুটি বার্তা "অবজেক্ট 'ফু' পাওয়া যায়নি" বরং একটি লাইক পাবেন get ত্রুটি "'ব্লে' বলে কোনও প্যাকেজ নেই"।

কেবলমাত্র গ্রহণযোগ্য ব্যবহারের ক্ষেত্রে requireহ'ল যখন এর রিটার্নের মানটি তাত্ক্ষণিকভাবে পরীক্ষা করা হয়, যেমন অন্য কয়েকটি উত্তর দেখায়। এটি একটি মোটামুটি সাধারণ প্যাটার্ন তবে এটির ক্ষেত্রেও অস্তিত্বের পরীক্ষা এবং প্যাকেজটির লোড পৃথক করে ভাল (এবং প্রস্তাবিত নীচে দেখুন) ভাল।

আরও প্রযুক্তিগতভাবে, requireআসলে libraryঅভ্যন্তরীণভাবে কল করে (যদি প্যাকেজটি ইতিমধ্যে সংযুক্ত না থাকে - তবে এটি requireনিরর্থক চেক করে, কারণ প্যাকেজটি ইতিমধ্যে লোড হয়েছে কিনা library তাও পরীক্ষা করে দেখুন)। requireএটি কী করে তা বোঝানোর জন্য এখানে একটি সরলীকৃত বাস্তবায়ন :

require = function (package) {
    already_attached = paste('package:', package) %in% search()
    if (already_attached) return(TRUE)
    maybe_error = try(library(package, character.only = TRUE)) 
    success = ! inherits(maybe_error, 'try-error')
    if (! success) cat("Failed")
    success
}

অভিজ্ঞ আর বিকাশকারীরা সম্মত হন:

I নিটার}, {বুকডাউন} এবং আরও অনেক প্যাকেজ লেখক ইহুই জাই বলেছেন :

ভদ্রমহোদয়গণ, আমি এটি আগে বলেছি: আর (প্যাকেজ) লোড করার ভুল পদ্ধতিটি প্রয়োজন; পরিবর্তে গ্রন্থাগার () ব্যবহার করুন

অন্য কারও চেয়ে বেশি জনপ্রিয় আর প্যাকেজের লেখক হ্যাডলি উইকহ্যাম বলেছেন

library(x)ডেটা বিশ্লেষণ স্ক্রিপ্টগুলিতে ব্যবহার করুন । […] আপনার কখনই ব্যবহার করার দরকার নেই require()( requireNamespace()প্রায় সবসময়ই ভাল)


আমি ঠিক একই রকম ছিলাম, যদি না আপনি সিনট্যাক্সের সাথে সমস্ত ফাংশন কল করে থাকেন তবে অবিকল তা এড়াতে class::functionব্যবহার করুন library()
ভুত

19
?library

এবং আপনি দেখতে পাবেন:

library(package)এবং require(package)উভয়ই নামের সাথে প্যাকেজটি লোড packageকরে অনুসন্ধান তালিকায় রাখে। requireঅন্যান্য ফাংশনের অভ্যন্তরে ব্যবহারের জন্য ডিজাইন করা হয়েছে; এটি প্যাকেজটির অস্তিত্ব না থাকলে ফিরে আসে FALSEএবং একটি সতর্কতা দেয় ( library()ডিফল্টরূপে করা ত্রুটির পরিবর্তে )। উভয় ফাংশন বর্তমানে লোড হওয়া প্যাকেজগুলির তালিকা পরীক্ষা করে আপডেট করে এবং ইতিমধ্যে লোড হওয়া কোনও প্যাকেজ পুনরায় লোড করে না। (আপনি যদি এই জাতীয় প্যাকেজটি পুনরায় লোড করতে চান তবে কল করুন detach(unload = TRUE)বা unloadNamespaceপ্রথমে)) আপনি যদি কোনও প্যাকেজ অনুসন্ধান তালিকায় না রেখে লোড করতে চান তবে ব্যবহার করুন requireNamespace


9

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


18
এটি আকর্ষণীয়, তবে আসলেই প্রশ্নের উত্তর নয় ...?
বেন বলকার


3

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

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

microbenchmark(req = require(microbenchmark), lib = library(microbenchmark),times = 100000)
Unit: microseconds
 expr    min     lq      mean median     uq        max neval
  req  3.676  5.181  6.596968  5.655  6.177   9456.006 1e+05
  lib 17.192 19.887 27.302907 20.852 22.490 255665.881 1e+05

আমি যুক্তি দেব যে libraryপরিবর্তে বাস্তবায়ন স্থির করার জন্য এটি একটি শক্ত কারণ (উভয় ফাংশন, বর্তমানে আর-এর সাথে প্রেরণ করা একটি বিশাল জগাখিচুড়ি)।
কনরাড রুডল্ফ

@KonradRudolph ভাল, যদি কেউ ফিক্স গ্রন্থাগার যাচ্ছে, হয়তো তারাও সংস্করণ দ্বারা লোড স্পষ্টভাবে সক্রিয় এবং সংযুক্তি একটি আর্গুমেন্ট বিকল্প করতে পারেন
আকৃতি

হ্যাঁ, আমি একেবারে সম্মত তবে সেগুলি কেবল পারফরম্যান্সকেই নয়, শব্দার্থবিজ্ঞানের পরিবর্তন করবে। যাইহোক, সংস্করণটি আর-এ প্যাকেজগুলির সাথে কখনই কাজ করবে না, দুর্ভাগ্যক্রমে। আমি এর পরিবর্তে (সত্যই!) কাজ করছি। সংযুক্তি হিসাবে, আপনি ব্যবহার করতে পারেন loadNamespace, যা কোনও প্যাকেজ লোড করে এবং এটি সংযুক্ত না করেই এর নাম স্থানটি দেয়।
কনরাড রুডলফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.