আর এর ইফলেস স্টেটমেন্ট কেন ভেক্টরকে ফিরিয়ে দিতে পারে না?


118

আমি সময়ে সময়ে আর এর ইফলেট বিবৃতিগুলি বেশ কার্যকর বলে খুঁজে পেয়েছি। উদাহরণ স্বরূপ:

ifelse(TRUE,1,2)
# [1] 1
ifelse(FALSE,1,2)
# [1] 2

তবে আমি নিম্নলিখিত আচরণে কিছুটা বিভ্রান্ত হয়ে পড়েছি।

ifelse(TRUE,c(1,2),c(3,4))
# [1] 1
ifelse(FALSE,c(1,2),c(3,4))
# [1] 3

এটি কি কোনও ডিজাইনের পছন্দ যা আমার বেতনের উপরে?


1
আইফেলসের জন্য সামান্য অদ্ভুত নকশাটি যদি অন্য কাজ করে তবে এই বিষয়টি সহজ।
এসবি

4
ifelse একটি ভেক্টরাইজড ফাংশন। এগুলি বিভিন্ন কাজের জন্য ব্যবহার করা উচিত।
মার্বেল

উত্তর:


98

ifelseরাজ্যের জন্য ডকুমেন্টেশন :

ifelseএকই আকৃতি সঙ্গে একটি মান হিসাবে testযা পারেন থেকে নির্বাচিত উপাদানের সঙ্গে ভরা হয় yesবা noউপর কিনা উপাদান নির্ভর করে testহয় TRUEবা FALSE

যেহেতু আপনি 1 দৈর্ঘ্যের পরীক্ষার মানগুলি অতিক্রম করছেন, আপনি দৈর্ঘ্যের 1 ফলাফল পেয়ে যাচ্ছেন you আপনি যদি দীর্ঘ পরীক্ষার ভেক্টরগুলি পাস করেন তবে আপনি দীর্ঘতর ফলাফল পাবেন:

> ifelse(c(TRUE, FALSE), c(1, 2), c(3, 4))
[1] 1 4

সুতরাং ifelseবুলিয়ানগুলির একটি ভেক্টর পরীক্ষা করার এবং একই দৈর্ঘ্যের একটি ভেক্টরকে (ভেক্টর) yesএবং noআর্গুমেন্ট থেকে নেওয়া উপাদানগুলিতে ভরাট করার জন্য নির্দিষ্ট উদ্দেশ্যে তৈরি করা হয় ।

ফাংশনটির নাম হিসাবে এটি একটি সাধারণ বিভ্রান্তি, যখন সত্যই আপনি if () {} else {}পরিবর্তে কেবল একটি সাধারণ নির্মাণ চান ।


16
সম্ভবত আপনি দ্বিতীয় সেট স্টেটমেন্টের জন্য যা চেয়েছিলেন তা ছিল if (TRUE) c(1,2) else c(3,4)
জোনাথন চ্যাং

69

আমি বাজি দিয়েছি যে আপনি - আর এর ifপরিবর্তে একটি সাধারণ বিবৃতি চান ifelse, ifএটি কেবল একটি নিয়ন্ত্রণ-প্রবাহ কাঠামো নয়, এটি কোনও মান ফিরিয়ে দিতে পারে:

> if(TRUE) c(1,2) else c(3,4)
[1] 1 2
> if(FALSE) c(1,2) else c(3,4)
[1] 3 4

@ কেন, এটি আমার পক্ষে কাজ করে, যদিও আমার " Warning in if (req(inputval) == "All") { : the condition has length > 1 and only the first element will be used"এই ধরণের সতর্কতা থেকে মুক্তি পেতে আমার কী করা উচিত?
ব্যবহারকারী5249203

1
@ user5249203, প্রশ্ন এবং কেন এর উত্তর যদি যেখানে শর্ত একটি একক মান, অর্থাত্, দৈর্ঘ্য 1. একটি ভেক্টর সাবধানবাণী ইঙ্গিত করে যে হয় পড়ুন req(inputval)আরো উপাদানগুলি নেই। একটি একক মান পেতে ফাংশন any()বা all()দরকারী হতে পারে।
উউই

11

মনে রাখবেন যে আপনি যদি ফলাফলটির মধ্যে স্থির করে থাকেন তবে আপনি সমস্যাটি সমাধান করতে পারেন ifelse:

ifelse(TRUE, a <- c(1,2), a <- c(3,4))
a
# [1] 1 2

ifelse(FALSE, a <- c(1,2), a <- c(3,4))
a
# [1] 3 4

3
আইএমএইচও, এই নিয়োগের জন্য ifelse()একটি নিয়ন্ত্রণ প্রবাহের জায়গায় ভেক্টরাইজড ফাংশনটির অপব্যবহার করতে উত্সাহিত করছে if ... else ...। শর্তটি যদি একক TRUEবা FALSEমান হয় তবে আমি লিখতে পছন্দ করি a <- if (TRUE) c(1,2) else c(3,4)বাif (TRUE) a <- c(1,2) else a <- c(3,4)
Uwe

1
@ আমরা যদিও এর ifelseপরিবর্তে ব্যবহারের সময় পারফরম্যান্সের পার্থক্যটি মনে করি না if... elseএকক শর্তের ক্ষেত্রে সত্যিই সমস্যা ifelseহতে পারে এবং কোডের অভ্যন্তরে কিছু ক্ষেত্রে পছন্দ করা যেতে পারে (এখানে সাধারণ অনুমান), আমি আপনার সাথে একমত হতে পারি না ;-)। আমি শুধু সাথে একটি উপায় প্রদর্শন করতে চেয়েছিলেন ifelse
ক্যাথ

9

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

plot(x,y, col = ifelse(x>2,  'red', 'blue'))

আপনার যদি টেস্টগুলির একটি দীর্ঘ দীর্ঘ ভেক্টর থাকে তবে আউটপুটগুলির জন্য জোড়া চান, আপনি সম্ভবত ব্যবহার করতে পারেন sapply()বা plyrএর llply()কিছু বা কিছু।


4

কখনও কখনও ব্যবহারকারীর একটি switchপরিবর্তে একটি বিবৃতি প্রয়োজন ifelse। এই ক্ষেত্রে:

condition <- TRUE
switch(2-condition, c(1, 2), c(3, 4))
#### [1] 1 2

(যা কেন উইলিয়ামসের উত্তরের অন্য একটি বাক্য গঠন বিকল্প)


4

এখানে ক্যাথের পরামর্শ অনুসারে অনুরূপ একটি পদ্ধতি রয়েছে, তবে এটি বিদ্যমান পূর্ব-নির্ধারিত ভেক্টরগুলির সাথে কাজ করতে পারে

এটি এর get()মতো ব্যবহার করে প্রায় ভিত্তিক :

a <- c(1,2)
b <- c(3,4)
get(ifelse(TRUE, "a", "b"))
# [1] 1 2

4

`if` ব্যবহার করুন, যেমন

> `if`(T,1:3,2:4)
[1] 1 2 3

এখানে কেবলমাত্র এটিই উত্তর যা আসলে ইফলেসের প্রত্যাশিত কার্যকারিতা সরবরাহ করতে পারে।
sus_MLm

2

আপনার ক্ষেত্রে, if_elseথেকে ব্যবহার dplyrকরা সহায়ক হত: এর if_elseচেয়ে আরও কঠোর ifelseএবং আপনার ক্ষেত্রে ত্রুটি ছুঁড়ে ফেলে:

library(dplyr)
if_else(TRUE,c(1,2),c(3,4))
#> `true` must be length 1 (length of `condition`), not 2

0

প্রতি পাতায় পাওয়া গেছে :

ifelse(rep(TRUE, length(c(1,2))), c(1,2),c(3,4))
#>[1] 1 2

পছন্দসই দৈর্ঘ্য ফিরিয়ে আনতে আপনার অবস্থার ফলাফলটি প্রতিলিপি করতে পারে

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