বুলিয়ান অপারেটরগুলি && এবং ||


252

মতে আর ভাষা সংজ্ঞা , পার্থক্য &এবং&& (সঙ্গতিপূর্ণভাবেই |এবং ||) যে সাবেক যখন আধুনিক নয় ভেক্টরকৃত হয়।

অনুসারে সহায়তার পাঠ্য , আমি "And" এবং "AndAlso" (আনুষ্ঠানিকভাবে "বা" এবং "OrElse") এর মধ্যে পার্থক্যটির মতোই পার্থক্যটি পড়ি ... অর্থ: সমস্ত মূল্যায়ন যদি তাদের না হয় তবে (যেমন A বা B বা C সর্বদা সত্য হয় যদি A সত্য হয়, সুতরাং A সত্য হলে মূল্যায়ন করা বন্ধ করুন)

কেউ এখানে আলোকপাত করতে পারে? এছাড়াও, আর-তে কি কোনও অ্যান্ডলসো এবং অরেলস আছে?


একই ধরণের প্রশ্নগুলি স্ট্যাকওভারফ্লো . com / q / 6933598/ 210673 এবং স্ট্যাকওভারফ্লো . com / q/ 7953833 / 210673 (এখন নকল হিসাবে বন্ধ) এও দেখুন see
অ্যারন

3
আমার মনে হয় && এবং || আরে খারাপভাবে প্রয়োগ করা হয় other আর তে দরকারী কিছু করবেন না।
স্ক্যান

উত্তর:


340

সংক্ষিপ্ততরগুলি ভেক্টরাইজড, যার অর্থ তারা ভেক্টরকে এইরকম ফিরে আসতে পারে:

((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE  TRUE FALSE FALSE

লম্বা ফর্ম প্রতিটি ভেক্টরের কেবল প্রথম উপাদানটি পরীক্ষা করে বাম থেকে ডানকে মূল্যায়ন করে, সুতরাং উপরেরটি দেয় gives

((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE

সহায়তার পৃষ্ঠাটি যেমনটি বলেছে এটি দীর্ঘতর রূপটিকে "প্রোগ্রামিং নিয়ন্ত্রণ প্রবাহের জন্য উপযুক্ত এবং [যদি] সাধারণত ক্লোসগুলিতে পছন্দ করা হয় তবে তা তৈরি হয়।"

সুতরাং আপনি দীর্ঘ ফর্মগুলি কেবল তখনই ব্যবহার করতে চান যখন আপনি নিশ্চিত হন যে ভেক্টরগুলির দৈর্ঘ্য একটি।

আপনার ভেক্টরগুলির দৈর্ঘ্য 1 সম্পূর্ণরূপে নিশ্চিত হওয়া উচিত , যেমন তাদের ক্ষেত্রে কেবলমাত্র দৈর্ঘ্য 1 বুলিয়ান ফিরে আসে functions আপনি যদি সংক্ষিপ্ত ফর্মগুলি ব্যবহার করতে চান তবে ভেক্টরগুলির দৈর্ঘ্য সম্ভাব্য> 1 হয়। তাই আপনি যদি একেবারে নিশ্চিত না হন, হয় আপনি প্রথমটি যাচাই করুন, বা সংক্ষেপে ফর্ম ব্যবহার এবং তারপর ব্যবহার করা উচিত allএবং anyনিয়ন্ত্রণ প্রবাহ বিবৃতি ব্যবহারের জন্য দৈর্ঘ্য এক এটি কমাতে মত if

ক্রিয়াকলাপগুলি allএবং anyপ্রায়শই যথাযথভাবে সমস্ত বা কোনও তুলনা সত্য কিনা তা দেখার জন্য ভেক্টরাইজড তুলনার ফলাফলের জন্য ব্যবহৃত হয়। এই ফাংশনগুলি থেকে ফলাফলগুলি দৈর্ঘ্য 1 হওয়ার বিষয়ে নিশ্চিত তাই তারা যদি অনুচ্ছেদগুলির তুলনায় প্রাপ্ত ফলাফলগুলি না হয় তবে ক্লজগুলি সেগুলি ব্যবহারের জন্য উপযুক্ত। (যদিও এই ফলাফলগুলি ব্যবহারের জন্য উপযুক্ত হবে ifelse

একটি চূড়ান্ত পার্থক্য: &&এবং ||কেবলমাত্র যতগুলি শর্ত প্রয়োজন তা মূল্যায়ন করুন (যা মনে হয় শর্ট সার্কিট দ্বারা বোঝানো)। উদাহরণস্বরূপ, এখানে একটি অপরিবর্তিত মান ব্যবহার করে একটি তুলনা করা হয়েছে a; যদি এটি শর্ট সার্কিট না করে &এবং যেমন |না করে তবে এটি একটি ত্রুটি দেয়।

a
# Error: object 'a' not found
TRUE || a
# [1] TRUE
FALSE && a
# [1] FALSE
TRUE | a
# Error: object 'a' not found
FALSE & a
# Error: object 'a' not found

অবশেষে, "এবং এবং এন্ড" শীর্ষক দ্য আর ইনফার্নোতে 8.2.17 বিভাগটি দেখুন ।


আমি দৈর্ঘ্যের লজিকালগুলির সাথে তুলনা করছি control নিয়ন্ত্রণ-প্রবাহের জন্য কেন এটি পছন্দ করা হয়েছে তা সম্পর্কে ডকুমেন্টেশন পরিষ্কার নয়। এটি কি কারণ এটি @ থিওর উত্তরগুলি থেকে "শর্ট সার্কিট" ব্যবহার করে এবং এর ফলে আরও ভাল পারফরম্যান্স হয়?
এসফুন 28

নাঃ। কেবল শর্ট ফর্মটি '&' ব্যবহার করুন - শর্ট সার্কিটের উত্তরগুলি ভুল।
এম টিবিটস

1
না, কারণ এটির একটিমাত্র সত্য / মিথ্যা উত্তর থাকার গ্যারান্টি রয়েছে। সংক্ষিপ্ত ফর্মগুলির ফলাফল হতে পারে c(TRUE, FALSE)এবং ifবিবৃতিটি পরিষ্কার হবে না। আপনি যদি নিশ্চিত হন যে সমস্ত কিছুর দৈর্ঘ্য 1 থাকে, তবে হ্যাঁ, হয় না, এবং আপনি সঠিক যে "শর্ট সার্কিট" এটিকে পছন্দ করার কারণ। সতর্কতার একটি শব্দ যদিও নিশ্চিত হন যে আপনি 100% নিশ্চিত যে সেগুলি কেবল দৈর্ঘ্যের হতে পারে। আপনি অন্যথায় সত্যিই বোকা বাগ পেতে পারেন।
হারুন

9
@ এসফুন ২৮: হ্যাঁ, সংক্ষিপ্তসার্কিটই এটি প্রবাহ নিয়ন্ত্রণের পক্ষে পছন্দ করেছে। পাশাপাশি আরও ভাল পারফরম্যান্স, আপনি সমস্ত যুক্তি মূল্যায়ন করতে নাও চান। ?is.Rআপনি আর বা এস-প্লাস চালাচ্ছেন কিনা তা যাচাইয়ের জন্য নৈমিত্তিক উদাহরণ দেওয়া আছে । if(exists("is.R") && is.function(is.R) && is.R())। যদি is.Rএটি না থাকে তবে আপনি মূল্যায়ন করতে চান না is.function(is.R)কারণ এটি একটি ত্রুটি ছুঁড়ে দেবে। তেমনিভাবে যদি is.Rকোনও ফাংশন না হয় তবে আপনি এটিকে কল করে যেমন কল করতে চান না।
রিচি কটন

2
আর নরকটির বর্তমান সংস্করণে, প্রাসঙ্গিক বিভাগটি এখন 8.2.17 "এবং এবং"
সিলভারফিশ

34

"শর্ট সার্কিট" সম্পর্কে উত্তর সম্ভাব্য বিভ্রান্তিকর, তবে এর কিছু সত্যতা রয়েছে (নীচে দেখুন)। আর / এস ভাষায়, &&এবং ||কেবল প্রথম যুক্তিতে প্রথম উপাদানটি মূল্যায়ন করুন। ভেক্টর বা তালিকার অন্য সমস্ত উপাদান প্রথম মানগুলি নির্বিশেষে উপেক্ষা করা হয়। এই অপারেটরগুলি if (cond) {} else{}নতুন ভেক্টর নির্মাণের পরিবর্তে নির্মাণের সাথে কাজ করার জন্য এবং সরাসরি প্রোগ্রাম নিয়ন্ত্রণের জন্য ডিজাইন করা হয়েছে .. &এবং |অপারেটরগুলি ভেক্টরগুলিতে কাজ করার জন্য ডিজাইন করা হয়েছে, সুতরাং তাদের "সমান্তরালভাবে" প্রয়োগ করা হবে, সুতরাং কথা বলার জন্য, দৈর্ঘ্যের পাশাপাশি দীর্ঘতম যুক্তি। তুলনা করার আগে উভয় ভেক্টরকে মূল্যায়ন করা দরকার। যদি ভেক্টরগুলি একই দৈর্ঘ্য না হয় তবে ছোট আর্গুমেন্টের পুনর্ব্যবহার করা হয়।

যখন তর্ক && বা ||মূল্যায়ন করা হয়, তখন "সংক্ষিপ্ত-সার্কিট" হয় যে বাম থেকে ডানে পর পরের কোনও মান যদি নির্ধারক হয় তবে মূল্যায়ন বন্ধ হয়ে যায় এবং চূড়ান্ত মান ফিরে আসে।

> if( print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(FALSE && print(1) ) {print(2)} else {print(3)} # `print(1)` not evaluated
[1] 3
> if(TRUE && print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(TRUE && !print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 3
> if(FALSE && !print(1) ) {print(2)} else {print(3)}
[1] 3

সংক্ষিপ্ত-সার্কিটের সুবিধা কেবল তখনই প্রদর্শিত হবে যখন তর্কগুলি মূল্যায়ন করতে দীর্ঘ সময় নেয়। এটি তখন ঘটতে পারে যখন আর্গুমেন্টগুলি এমন ফাংশন হয় যা হয় বৃহত্তর অবজেক্টগুলিকে প্রক্রিয়াজাত করে বা গাণিতিক ক্রিয়াকলাপগুলি আরও জটিল।


"শর্ট-সার্কিট" আমার কাছে একটি নতুন শব্দ, তবে আমার কাছে মনে হয় যে এটির বর্ণনা দেওয়া উত্তরটি আপনি &&এবং কী সম্পর্কে বলেছেন তার সাথে একমত ||
অ্যারোন

@ ডিউইন - দৈর্ঘ্যের ১ টি লজিক্যাল অপারেটিংয়ের ক্ষেত্রে সেগুলি কি ঠিক সমান? ডকুমেন্টেশনের বিবরণ হিসাবে কেন নিয়ন্ত্রণ-প্রবাহে এগুলিকে প্রাধান্য দেওয়া হয় তা বোঝার চেষ্টা করছি। এছাড়াও, আর কি একটি "শর্ট সার্কিট" নির্মাণ করতে পারে?
এসফুন 28

তারা দৈর্ঘ্যের ভেক্টরগুলির সমতুল্য নয় > 1
এম টিবিটস

2
এটি সত্য যে আর্গুমেন্টগুলি যদি &&ফাংশন হয় এবং প্রথমটি মিথ্যা হয়, তবে দ্বিতীয়টি মূল্যায়ন করা হবে না। এটি উভয় তর্ককে মূল্যায়ন করবে &বা ifelseউভয়ের পক্ষে সত্য নয় ।
আইআরটিএফএম

শর্ট সার্কিটিং সম্পর্কে থিওর উত্তর কি তা বলে না?
অ্যারন

25

&& এবং || এগুলিকে "শর্ট সার্কিট" বলা হয়। এর অর্থ হ'ল প্রথম অপারেন্ডটি এক্সপ্রেশনটির মান নির্ধারণের জন্য যথেষ্ট হলে তারা দ্বিতীয় অপারেন্ডকে মূল্যায়ন করবে না।

উদাহরণস্বরূপ যদি প্রথম অপারেন্ডটি &&মিথ্যা হয় তবে দ্বিতীয় অপারেন্ডকে মূল্যায়ন করার কোনও অর্থ নেই, যেহেতু এটি এক্সপ্রেশনটির মান পরিবর্তন করতে পারে না ( false && trueএবং false && falseউভয়ই মিথ্যা)। একই জন্য যায়||প্রথম অপারেন্ড সত্য হলে হয়।

আপনি এখানে এ সম্পর্কে আরও পড়তে পারেন: http://en.wikedia.org/wiki/Short-circuit_evaluation page পৃষ্ঠার সারণী থেকে আপনি দেখতে পাচ্ছেন যে ভিবি.এনইটি-র &&সমতুল্য AndAlso, আমি ধরে নিচ্ছি যে আপনি উল্লেখ করছেন।


3
এই প্রমাণ যথেষ্ট এটি সংক্ষিপ্ত circuiting হয় হওয়া উচিত: f <- function() { print('hello'); TRUE }; FALSE && f()। পরিবর্তন করুন &এবং লক্ষ্য করুন যে ফাংশনটি মূল্যায়ন করা হয়েছে। Qed।
থিও

2
থিও, হ্যাঁ, আপনি যে সঠিক &&এবং ||শর্ট সার্কিট। তবে এটি সংক্ষিপ্ত রূপ এবং দীর্ঘ ফর্মের মধ্যে তুলনা করার ক্ষেত্রে একটি মোটামুটি পয়েন্ট point ইনপুটগুলি ভেক্টর হওয়ার সময় প্রতিটি কী করে তা বোঝা আরও অনেক গুরুত্বপূর্ণ।
অ্যারন

2
@ এমটিবিটস আসলে এটি সম্পূর্ণ উত্তর নয়, তবে শর্ট সার্কিট সম্পর্কে বিবৃতিটি সঠিক । চেষ্টা করুন F & {message("Boo!");T}এবং F && {message("Boo!");T}
এমবিকিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.