در یکی از پستهای قبلی وبلاگ، با استفاده از الگوریتم Topsis یک موبایل انتخاب کردیم و در پست قبلی یاد گرفتیم که چطور میتوان در R یک تابع نوشت. همچنین در پست قبلی قرار شد با یک مثال روند نوشتن تابع در R را بررسی کنیم و به نظر میرسد همان الگوریتم Topsis مثال خوبی برای این کار باشد.
برای یادآوری توصیه میکنم پست مربوط به topsis را دوباره بخوانید. به طور خلاصه، در آن پست، ما مشخصات سه گوشی موبایل را در قالب یک ماتریس به الگوریتم دادیم، برای هر شاخص یک وزن مشخص کردیم و در نهایت الگوریتم به ما گفت که کدام گوشی به ایدهآل ذهنی ما نزدیکتر است. تابع ما باید سه ورودی که شامل ماتریس اصلی تصمیمگیری، بردار وزنها و بردار مشخص کننده شاخصهای مثبت و منفی است را بگیرد و در نهایت یک بردار تحویل دهد. تمام کدهایی که در آن مطلب برای اجرای الگوریتم نوشتیم اینها بودند:
r <- t(t(x)/sqrt(colSums(x^2))) v <- t(w * t(r)) vm <- t(i * t(v)) ap <- (apply(vm,MARGIN = 2,FUN = max)) * i an <- (apply(vm,MARGIN = 2,FUN = min)) * i dp <- apply(v,1,function(x)sqrt(sum((x-ap)^2))) dn <- apply(v,1,function(x)sqrt(sum((x-an)^2))) c <- dn / (dp + dn) sort(c,decreasing =TRUE)
همین کدها را در قالب یک تابع R در پنجره source (با فشردن ctrl+shift+N باز میشود) مینویسیم و آن را اجرا میکنیم:
topsis <- function(x,w,i) { r <- t(t(x)/sqrt(colSums(x^2))) v <- t(w * t(r)) vm <- t(i * t(v)) ap <- (apply(vm,MARGIN = 2,FUN = max)) * i an <- (apply(vm,MARGIN = 2,FUN = min)) * i dp <- apply(v,1,function(x)sqrt(sum((x-ap)^2))) dn <- apply(v,1,function(x)sqrt(sum((x-an)^2))) c <- dn / (dp + dn) sort(c,decreasing =TRUE) }
احتمالا باید چیزی شبیه این را ببینید:
همین کدی را که در source نوشتهاید را با ماوس انتخاب کنید و روی Run کلیک کنید. با نگاهی به پنل work space میتوانید مشاهده کنید که تابع topsis در حافظه قرار گرفته و قابل فرواخوانی شدن است. دادههای پست topsis را با اجرای کدهای زیر در R وارد میکنیم تا تابع را امتحان کنیم.
x <- matrix(c(5.3,5.7,5.1,16,16,12,455,574,500,9,7,9,159,192,152,599,699,649,9,7,9),nrow = 3) colnames(x) <- c("screen","MP","charge","cpu","weight","price","design") rownames(x) <- c("g5","v10","s7") w <- c(0.2,0.05,0.2,0.1,0.05,0.3,0.1) i <- c(1,1,1,1,-1,-1,1)
حالا نوبت اجرای تابع است. تابع به صورت زیر فراخوانی میشود:
topsis(x,w,i)
بعد از اجرا تابع نتیجه زیر را به ما بر میگرداند که دقیقا همان نتیجه بدست آمده در حالتی بود که از تابع استفاده نکرده بودیم.
topsis(x,w,i) g5 s7 v10 0.5511979 0.5041887 0.4773864
میتوانید با کلیک روی گزینه save پنل source این تابع را برای استفادههای آینده ذخیره کنید.
چند نکتهی تکمیلی دربارهی توابع در R:
- با توابع در R میتوانید مانند هر شئ دیگری در R رفتار کنید.
- میتوان یک تابع را به عنوان argument یک تابع دیگر استفاده نمود.
- میتواند درون یک تابع، یک تابع دیگر تعریف کرد.
در نوشتن بخشهایی از این پست از این مطلب کمک گرفته شده است.