آموزش نرم‌افزار R برای علوم داده: عبارات شرطی و حلقه‌ها

ساختارهای کنترلی (Control Structures) در نرم‌افزار R به شما اجازه می‌دهد تا نحوه اجرای عبارات نوشته‌شده را پایش کنید. به‌این‌ترتیب با قرار دادن عبارات منطقی، بسته به این‌که ورودی‌ها چگونه باشد، دستورات متفاوتی اجرا می‌شود. ساختارهای کنترلی عمده در R به شرح زیر است:

دستور if  و else: بررسی یک شرط و عمل بر اساس آن

دستورfor: اجرای یک حلقه به تعداد مشخص

دستور while: اجرای یک حلقه تا زمانی که یک شرط برقرار است

دستور repeat: اجرای بی‌نهایت بار یک حلقه (باید همراه دستور break بکار رود تا متوقف شود)

دستور break: متوقف کردن یک حلقه

دستور next: پریدن از روی یک عبارت

در این مقاله من به نحوه کدنویسی ساختارهای کنترلی در R می‌پردازم. رویکرد من در آموزش برنامه‌نویسی R بیشتر مبتنی بر استفاده از مثال است تا خواننده با اجرای کدها بتواند این زبان را یاد بگیرد.

برای آشنایی با نحوه شروع به کار با نرم‌افزار R به مقاله “آموزش نرم‌افزار R برای علوم داده: مباحث مقدماتی” مراجعه کنید.

عبارات شرطی

در مثال زیر ساده‌ترین حالت برای ایجاد یک عبارت شرطی را در R می‌بینید. در ابتدا من به متغیر x مقدار ۵ را تخصیص دادم. سپس یک عبارت شرطی نوشتم که مقدار متغیر x را بررسی می‌کند. اگر بزرگ‌تر از صفر بود، دستور print اجرا و اعلام می‌شود که آن عدد مثبت است. در این مثال اگر x منفی باشد، دستور print اجرا نمی‌شود و R از عبارت شرطی عبور می‌کند.

حال اگر بخواهم یک عبارت شرطی بنویسم که درصورتی‌که متغیر x بزرگ‌تر از صفر باشد، اعلام شود که آن عدد مثبت است و درصورتی‌که متغیر x کوچک‌تر از صفر باشد، اعلام شود آن عدد منفی است، می‌توان از ترکیب if و else به شکل زیر استفاده کرد:

عبارات شرطی ساده را می‌توان در یک خط هم نوشت. برای نمونه کد قبلی را به این شکل در یک خط خلاصه کردم:

ایراد کد بالا در این است که اگر مقدار صفر به متغیر x داده شود، عبارت عدد منفی چاپ می‌شود که غلط است. برای آنکه بتوانم همه حالت‌ها را در نظر بگیرم، باید از عبارات شرطی به شکل تودرتو استفاده کنم.

عبارات شرطی روی قالب‌های داده

روش بالا برای زمانی که با بردارها، ماتریس‌ها و قالب‌های داده یا دیتا فریم‌ها در R کار می‌کنیم، کاربرد ندارد. برای نوشتن عبارات شرطی در این حالت باید از تابع ifelse استفاده کرد. در مثال زیر من ابتدا یک دیتا فریم به نام data ایجاد کردم. این دیتا فریم دارای سه ستون است. ستون اول (x1) اعداد فرد بین ۱ تا ۲۰ را شامل می‌شود. ستون دوم (x2) 10 عدد از مجموعه اعداد بین ۵۰ تا ۱۰۰ را که با استفاده از تابع sample به‌صورت تصادفی انتخاب شدند، شامل می‌شود. ستون سوم (x3) شامل ۱۰ حرف اول الفبای انگلیسی است. و درنهایت با استفاده از data.frame این سه بردار را به شکل دیتا فریم درآوردم.

حال فرض کنید، می‌خواهم در دیتا فریم data ستون چهارمی ایجاد کنم که مقادیر این ستون صفر یا یک هستند. مقدار هر درایه در ستون چهارم بر این اساس تعیین می‌شود که عدد متناظر آن در ستون دوم از ۷۰ بزرگ‌تر است یا نه. برای مثال درایه ردیف اول واقع در ستون دوم، از ۷۰ کوچک‌تر است، بنابراین درایه واقع در ستون چهارم در ردیف اول باید مقدار صفر به خود بگیرد.

در مثال زیر حالت دیگری را بررسی کردم که ستون جدیدی به نام z در دیتا فریم data ایجاد کردم. در این کد، تابع شرطی ستون سوم دیتا فریم  را بررسی می‌کند و اگر هر درایه واقع در این ستون منطبق با یکی از حروف B ،A و C باشد، مقدار درایه متناظر در ستون z  چهار برابر مقدار متناظر در ستون اول است، در غیراینصورت ده برابر مقدار متناظر در ستون اول خواهد شد. برای مثال، در ردیف اول درایه ستون سوم A است، پس شرط برقرار است و مقدار ستون سوم، از حاصل‌ضرب عدد ۱  در ۴ به دست می‌آید.

عبارات شرطی را می‌توانید با عملگرهای منطقی “یا” (Or) و “و” (And) هم بکار ببرید. در کد زیر من از ترکیب عبارت شرطی و عملگر “یا” به همراه تابع sum استفاده کردم تا تعداد حالت‌های موردنظر را که یک شرط برقرار است به دست آورم. در این مثال، من می‌خواهم بدانم چند درایه در ستون اول هستند که از ۵ کوچک‌ترند یا از ۱۵بزرگ‌ترند.

حلقه for

دستور for یکی از پرکاربردترین روش‌ها برای نوشتن حلقه‌ها در R است. در کدهای زیر، به تعداد ۱۰ بار دستور print اجرا شده است. عددی که چاپ می‌شود از جمع ۵ با چندمین باری است که دستور اجرا می‌شود. حلقه‌های ساده for  را می‌توان به‌صورت خطی نیز نوشت.

در این کد، من حلقه را روی دیتا فریم data اجرا کردم. به‌این‌ترتیب که درایه‌های ستون دوم به ترتیب چاپ می‌شوند:

معمولاً تابع seq_along در حلقه‌هایی که برای ماتریس‌ها یا دیتا فریم‌ها می‌نویسیم، زیاد کاربرد دارد. در نمونه زیر، به‌جای آنکه تعداد ردیف‌های دیتا فریم را مستقیم به حلقه بدهم، از تابع seq_along استفاده کردم تا خودش تعداد ردیف دیتا فریم را تشخیص دهد و به تعداد آن حلقه را تکرار کند.

مانند عبارات شرطی می‌توانیم، حلقه‌های تودرتو هم داشته باشیم. در زیر من از دو حلقه به‌صورت تودرتو استفاده کردم تا یک ماتریس مربعی ۱۰ در ۱۰ مشابه جدول‌ضرب ایجاد کنم. توجه کنید در این مثال من ابتدا ابعاد ماتریس را تعریف کردم ولی مشخص نکردم درایه‌های آن باید چگونه باشند. سپس با استفاده از حلقه‌های تودرتو، درایه‌های آن را تخصیص دادم.

حلقه while

در بیشتر کاربردها، حلقه for استفاده می‌شود. اما در کاربردهای مربوط به شبیه‌سازی احتمال زیادی دارد که از حلقه while استفاده کنیم. در زیر، من نحوه استفاده از حلقه while را با یک مثال ساده نشان دادم. هدف از این حلقه چاپ اعداد صحیح ۰ تا ۹ است. همان‌طور که مشخص است این حلقه تا زمانی ادامه می‌یابد که مقدار متغیر c کوچک‌تر از ۱۰ باشد.

در اینجا از حلقه while  استفاده کردم تا پرتاب سکه را شبیه‌سازی کنم. هدف از شبیه‌سازی این است که آن‌قدر سکه پرتاب کنم تا تعداد کل برآمدهای شیر ۳ شود. پس از این‌که سه بار برآمد شیر داشتم، پرتاب سکه متوقف می‌شود. در آخر نیز باید تعداد کل پرتاب سکه‌ها در این آزمایش به نمایش دربیاید.

برای این منظور دو متغیر flips و nheads با مقدار اولیه صفر تعریف کردم که به ترتیب تعداد پرتاب‌های سکه در آزمایش و تعداد برآمدهای شیر را نشان می‌دهد. چون قرار است تعداد پرتاب‌ها پس از برقرار شدن یک عبارت شرطی متوقف شود، از while استفاده کردم. از تابع sample  بهره بردم تا با هر بار اجرای دستور شرطی از بین شیر و خط یکی را به‌صورت تصادفی انتخاب کند. اگر این برآمد برابر شیر باشد، دستور شرطی مقدار nheads را به‌روزرسانی می‌کند. با اجرای حلقه باید یک واحد به متغیر flips اضافه شود. به این فکر کنید در دستور زیر چرا حلقه تا زمانی که متغیر nheads کوچک‌تر از ۳ است، باید ادامه یابد.

توجه کنید هر بار که کد بالا اجرا شود، مقدار متفاوتی برای flips به دست می‌آید. در شبیه‌سازی بالا پس از ۸ بار پرتاب سکه، سومین برآمد شیر ظاهر و فرآیند پرتاب سکه متوقف می‌شود.

حلقه repeat و دستور break

با شروع اجرای دستور repeat حلقه به تعداد بی‌نهایت بار تکرار می‌شود. معمولاً در کاربردهای تحلیل داده با چنین شرایطی روبرو نیستیم که بخواهیم از این دستور استفاده کنیم. تنها راه برای متوقف کردن repeat استفاده از دستور break  است. در مثال ساده زیر من یک حلقه با استفاده از دستور repeat و break ساختم:

در کد بالا، حلقه تا زمانی که مقدار متغیر a از ۴ بزرگ‌تر شود، ادامه می‌یابد.

توجه کنید دستور break را در حلقه‌های دیگر نیز می‌توان استفاده کرد:

یک حالت قابل‌تصور برای استفاده از دستور repeat آن است که در الگوریتم تکرارشونده‌ای استفاده شود که به دنبال یک جواب می‌گردد و ما می‌خواهیم تا وقتی به‌اندازه کافی الگوریتم به آن جواب نزدیک نشده، حلقه متوقف نگردد. در این‌ مواقع تعداد تکرارها برای رسیدن به نزدیکی جواب از پیش مشخص نیست. گرچه در این حالت هم باید مراقب بود تا الگوریتم در نزدیکی جواب شروع به نوسان نکند و حلقه تا بی‌نهایت تکرار شود.

دستور next

این دستور زمانی بکار می‌رود که بخواهیم از تکرارهایی در داخل یک حلقه عبور کنیم. در مثال زیر، زمانی که i به مقدار ۲ می‌رسد، حلقه از دستور print می‌پرد.

مقالات آموزش زبان R در آنالیکا

آموزش نرم‌افزار R برای علوم داده: مباحث مقدماتی

آموزش نرم‌افزار R برای علوم داده: خواندن و نوشتن داده‌ها

آموزش نرم‌افزار R برای علوم داده: عبارات شرطی و حلقه‌ها

آموزش نرم‌افزار R برای علوم داده: توابع

آموزش نرم‌افزار R برای علوم داده: رسم نمودار

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *