আমদানি / নির্ভর করে কখন ব্যবহার করবেন তার আরও ভাল ব্যাখ্যা


148

" রাইটিং আর এক্সটেনশানগুলি " ম্যানুয়ালটি কখন আমদানি বা নির্ভর করে:

সাধারণ নিয়মগুলি হ'ল

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

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

সম্পাদন করা

আমি এই নির্দিষ্ট বিষয়ে একটি বিভাগ সহ একটি ব্লগ পোস্ট লিখেছিলাম ('আমদানি বনাম নির্ভর করে' অনুসন্ধান করুন)। ভিজ্যুয়ালগুলি এটি বোঝা অনেক সহজ করে তোলে।


1
আপনার ব্লগ পোস্ট আমাকে প্যাকেজ কাঠামো সম্পর্কে সবকিছু জানিয়েছিল, যখন আমি মডিউলগুলি পরিকল্পনা শুরু করি । ধন্যবাদ!
কনরাড রুডলফ

উত্তর:


143

"Imports"এর চেয়ে নিরাপদ "Depends"(এবং এটি ব্যবহার করে এমন অন্যান্য প্যাকেজগুলির ক্ষেত্রে এটি 'আরও ভাল নাগরিক' ব্যবহার করে একটি প্যাকেজ তৈরি করে "Depends")।

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

নিয়মিত অনুসন্ধানের পথের পরিবর্তে যে "Imports"কোনও সমর্থনকারী প্যাকেজটির কাজগুলি <imports:packageName>(তত্ক্ষণাত <namespace:packageName>সন্ধানের পরে ) স্থাপন করা উচিত তার জন্য একটি নির্দেশিকা ব্যবহার করা উচিত । উপরের উদাহরণের প্যাকেজগুলির মধ্যে যে কোনও একটি যদি "Imports"মেকানিজম ব্যবহার করে (যার জন্য ফাইলটিতে প্রয়োজনীয়তা importবা importFromনির্দেশিকাও NAMESPACEথাকে) তবে বিষয়গুলি দুটি উপায়ে উন্নত হবে। (1) প্যাকেজটি নিজেই কোন mgcvক্রিয়াকলাপটি ব্যবহৃত হবে তার উপর নিয়ন্ত্রণ অর্জন করবে । (২) আমদানিকৃত বিষয়গুলির মূল অনুসন্ধানের পথটি পরিষ্কার রেখে, এটি অন্য প্যাকেজের অন্যান্য mgcvক্রিয়াকলাপের নির্ভরতাও সম্ভাব্যভাবে ভাঙবে না ।

এজন্যই নেমস্পেসগুলি ব্যবহার করা যেমন একটি ভাল অনুশীলন, এটি কেন এখন সিআরএএন দ্বারা প্রয়োগ করা হয় এবং (বিশেষত) কেন ব্যবহার "Imports"করা ব্যবহারের চেয়ে নিরাপদ "Depends"


একটি গুরুত্বপূর্ণ ক্যাভিয়েট যুক্ত করতে সম্পাদিত:

নেই এক উপরে উপদেশ দুর্ভাগ্যবশত সাধারণ ব্যতিক্রম: যদি আপনার প্যাকেজ প্যাকেজ উপর নির্ভর Aযা নিজেই "Depends"আরেকটি প্যাকেজ B, আপনার প্যাকেজ সম্ভবত সংযুক্ত করতে হবে Aএকটি সঙ্গে "Dependsনির্দেশ।

এটি কারণ প্যাকেজটিতে ফাংশনগুলি Aএই প্রত্যাশার সাথে লেখা হয়েছিল যে প্যাকেজ Bএবং এর ক্রিয়াকলাপগুলি search()পথের সাথে সংযুক্ত থাকবে

একটি "Depends"নির্দেশ প্যাকেজ লোড এবং সংযুক্ত করবে A, যেখানে প্যাকেজের Aনিজস্ব "Depends"নির্দেশ, একটি চেইন প্রতিক্রিয়াতে, প্যাকেজটি Bলোড করা এবং সংযুক্ত করার কারণ ঘটায় । প্যাকেজের Aকার্যাদি তারপরে প্যাকেজের যে ফাংশনগুলিতে Bতারা নির্ভর করে তা সন্ধান করতে সক্ষম হবে ।

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

শুধুমাত্র দুটি সমাধান হয়:

  1. Aকোনও "Depends"নির্দেশিকা ব্যবহার করে আপনার প্যাকেজটি সংযুক্ত করুন package
  2. দীর্ঘমেয়াদে আরও ভাল, প্যাকেজটির রক্ষণাবেক্ষণকারীর সাথে যোগাযোগ করুন Aএবং তাদের নাম স্থানটি ( এই সম্পর্কিত উত্তরে মার্টিন মরগানের ভাষায়) নির্মাণের জন্য আরও সতর্কতার সাথে কাজ করার জন্য বলুন ।

1
সম্প্রতি একটি অনুরূপ প্রশ্ন জিজ্ঞাসা করা হয়েছে এবং সম্প্রতি এই সমস্যাগুলির সাথে দৃigh়তার সাথে কুস্তি খেয়েছে, এগুলি সূক্ষ্ম এবং প্রায়শই অ-যোগাযোগের ধারণা। আমি আপনাকে অন্য ব্যাখ্যার জন্য এখানে রেফার করব: stackoverflow.com/questions/7880355/…
ব্রায়ান হ্যানসন

@ ব্রায়ান হ্যানসন - এই লিঙ্কে নোট লেখার জন্য ধন্যবাদ। মধ্যে পার্থক্য Importsএবং Dependswrt সংস্করণ প্রয়োজনীয়তা এবং উদাহরণ পরীক্ষা .Rdফাইল প্রকৃতপক্ষে সূক্ষ্ম এবং প্রায় বুদ্ধিমান মূল্য আছে।
জোশ ও'ব্রায়েন

1
'নির্ভর করে' ব্যবহার করে নির্ভরতা সম্পর্কে সতর্কতা একটি ভয়ঙ্কর জিনিস। এর অর্থ হ'ল আমি সবাই অন্যরকম না হওয়া পর্যন্ত মূলত আমার প্যাকেজে 'আমদানি' ব্যবহার করতে পারি না। = (
কেন উইলিয়ামস

আমি এখনও অস্পষ্ট যে একটি জিনিস, আমি যদি একটি প্যাকেজ লিখতে হয়, এবং আমি করতে চান Imports: ggplot2, আমার প্যাকেজ তারপর autoplotফাংশন খুঁজে না ? স্পষ্টতই Dependsএর প্যাকেজ লাইব্রেরি সংযুক্ত করে ggplot2এবং তাই কোনও সমস্যা নেই। উদাহরণস্বরূপ আমার একটি ফাংশন রয়েছে autoplot.myFunction() যা @import ggplot2ট্যাগটি ব্যবহার করে এবং আমার প্যাকেজটিতে রয়েছে Imports: ggplot2তবে আমি একটি ত্রুটি Error in eval(expr, envir, enclos) : could not find function "autoplot"পেয়েছি : যখন আমি এটি ব্যবহার করার চেষ্টা করি।
নাথনেস্টউড

1
@ উইলিম ধন্যবাদ আপনি অবশ্যই সঠিক, এবং আমি বিভ্রান্তিকর বিষয়বস্তু পরিষ্কার করতে উত্তর সম্পাদনা করেছি। এই জটিলটির উত্তর দিতে কী জটিল হয়েছিল, তার একটি অংশ হ'ল, ওপি তার প্রশ্নটির কাঠামো Dependsএবং Importsবিভাগগুলির রেফারেন্স দিয়ে ফ্রেম তৈরি করার সময় DESCRIPTION, তিনি সত্যই কোনও ফাংশনকে "আমদানি" করার (এটি "নির্ভর" না হওয়ার) অর্থ কী তা সম্পর্কে জিজ্ঞাসা করেছিলেন। যেহেতু এই উত্তরটি আমি উত্তর দেওয়ার চেষ্টা করেছি (এবং - আমার সন্দেহ হয় - বেশিরভাগ লোকেরা এই উত্তরটি সন্ধান করছে তারা কী জানতে চায়), তাই আমি উত্তরটি অন্যথায় অপরিবর্তিত রেখে দেব leave
জোশ ও'ব্রায়েন

31

হ্যাডলি উইকহাম একটি সহজ ব্যাখ্যা দেয় ( http://r-pkgs.had.co.nz/namespace.html ):

একটিতে প্যাকেজ তালিকাভুক্ত করা Dependsবা Importsএটি প্রয়োজন হলে এটি ইনস্টল হওয়া নিশ্চিত করে। মূল পার্থক্যটি হ'ল যেখানে Importsপ্যাকেজটি লোড হয়, Dependsএটি সংযুক্ত করে। অন্য কোন পার্থক্য নেই। [...]

যদি না সেখানে একটি ভাল কারণ অন্যথায় হয়, তাহলে আপনি সবসময় তালিকা প্যাকেজ উচিত Importsনয় Dependsএটি কারণ একটি ভাল প্যাকেজ স্ব-অন্তর্ভুক্ত, এবং বিশ্ব পরিবেশে পরিবর্তনগুলি সন্ধান করে (অনুসন্ধানের পথ সহ)। কেবলমাত্র ব্যতিক্রম হ'ল যদি আপনার প্যাকেজটি অন্য প্যাকেজের সাথে একযোগে ব্যবহার করার জন্য ডিজাইন করা হয়। উদাহরণস্বরূপ, অ্যানালগ প্যাকেজটি ভেগান শীর্ষে তৈরি করে। এটি ভেগান ব্যতীত কার্যকর নয়, সুতরাং এটির Dependsপরিবর্তে এটি ভেজান রয়েছে Imports। একইভাবে, ggplot2 এটিকে আমদানির পরিবর্তে স্কেলের উপর নির্ভর করে।


15

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


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

2
ডেটা অ্যানালাইসিসের জন্য সফ্টওয়্যার : স্প্রিঞ্জার / স্ট্যাটিস্টিকস / কমপুট্যানিয়াল+ স্ট্যাটাস্টিক্স / বই / ........... আপনার প্রশ্নগুলির জন্য, আমি উত্তরটি জানি না, তবে আপনি খুব সহজেই একটি ন্যূনতম পরীক্ষার প্যাকেজ হ্যাক করতে পারেন এবং উত্তরটি খুঁজে পেতে পারেন
অনুপ্রাণিতভাবে

1
এসএফডিএ == "ডেটা বিশ্লেষণের জন্য সফ্টওয়্যার"। [65] r-project.org/doc/bib/R-books.html এ । যদি কোনও প্যাকেজ অন্য প্যাকেজ নির্দিষ্ট করে, আপনি কনসোলে কোনও লাইব্রেরি () ব্যবহার করতে বা () ব্যবহার করার সময় নির্ভর (এনকিসি) এবং আমদানি (অেশনগুলি) লোড করার বিষয়ে আপনাকে একটি বার্তা দেখতে হবে। হ্যাঁ, সেগুলি তখন উপলভ্য হওয়া উচিত।
আইআরটিএফএম

4
+1 - এটি আমার দৃ strong় ছাপও। এছাড়াও, আমদানিগুলিতে নির্দিষ্ট করা প্যাকেজটির <namespace:packageName>অংশ হিসাবে তত্ক্ষণাত অনুসন্ধান করা হবে <imports:packageName>। আর কোনও কল করার library()প্রয়োজন নেই, এবং আর প্যাকেজ লোড-টাইমে কনসোলে আপনাকে অবহিত করবে না যতক্ষণ না Importএড প্যাকেজটি খুঁজে পাওয়া যায় না।
জোশ ও ব্রায়েন

5

কোনটি ব্যবহার করবেন তা সিদ্ধান্ত নিতে আপনাকে সহায়তা করার জন্য এখানে একটি সহজ প্রশ্ন:

আপনার প্যাকেজটির কি শেষ প্যাকেজের অন্য প্যাকেজের ফাংশনে সরাসরি অ্যাক্সেস থাকা দরকার?

  • না -> আমদানি (সর্বাধিক সাধারণ উত্তর)
  • হ্যাঁ -> নির্ভর করে

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

এটি হ'ল সতর্কতা হ'ল আপনি যদি 'ইমপোর্টস'-এ প্যাকেজ যুক্ত করেন, যেমনটি আপনার সাধারণত করা উচিত, আপনার কোডটিকে সেই প্যাকেজটির ফাংশনগুলি উল্লেখ করতে হবে, পুরো নেমস্পেস সিনট্যাক্স ব্যবহার করে, যেমন dplyr::mutate(), ঠিক পরিবর্তে mutate()। এটি কোডটি পড়ার জন্য কিছুটা ক্লুঙ্কিয়ার করে তোলে তবে আরও ভাল প্যাকেজ হাইজিনের জন্য মূল্য দিতে এটি একটি ছোট দাম।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.