توابع در R (مریم واعظ)

1402/06/14

دسترسی سریع


نام دانشجو : مریم واعظ

درس توابع در R

استاد: آقای خاورزاده

توابع درR

تقریباٌ کلیه اعمال R توسط توابع انجام می گیرد. به عنوان مثال برای بستن پنجره R از تابع q() استفاده می شود. در حقیقت با نوشتن q() در محیط R نرم افزار تابع q() را فراخوانی و اجرا می نماید به طور کلی دو دسته تابع در محیط نرم افزار R مورد استفاده قرار می گیرد. دسته اول تابع داخلی هستند از پیش نوشته شده و در نرم افزار موجود هستند و دسته دوم توابعی هستند که توسط کاربر برای اهداف خاص ایجاد و مورد استفاده قرار می گیرد. توابع چه داخلی باشند و چه توسط کاربر تعریف شوند دارای  ساختار مشابهی هستند. هر تابع از سه قسمت اصلی نام، برهان(ها) و بدنه تشکیل شده است. شکل کلی توابع در R  به صورت زیر است.

{بدنه تابع} (فهرست برهان) FUNCTION -> نام تابع

همانگونه که ملاحظه می شود فهرست برهان یا برهان های مورد نیاز در تابع درون () و بدنه که کارکرد اصلی یک تابع است در درون علامت{} قرار می گیرد. نام تابع که به نوع بیانگر وظیفه آن نیز می باشد به استفاده صحیح از یک تابع کمک       می نماید در مثال زیر تابعی نوشته شده است تا اعداد آبجیکت x را به توان 2 برساند.

expon ≤  FUNCTION (x){ x*x} u

>x<-3 v

>expon(x)  w

[1]9

همانگونه که ملاحظه می شود نام تابع expon است و برهان آن آبجکت x است (u). وظیفه ( بدنه) تابع نیز به توان رسانیدن اعضای آبجکت x می باشد (v). برای استفاده از این تابع نام آن هواره با برهان (آبجکت) مورد نیاز فراخوانی شده است(w) در فراخوانی تابع می توانیم از نام برهان و یا از مقداری واقعی آنها استفاده نماییم. در مثال فوق expon(3) تفاوتی با expon(x) نخواهد داشت.

چنانچه بدنه تابع تنها از یک عبارت تشکیل شده باشد نیازی به {} نمی باشد. در مثال فوق حذف علامت{} تاٌثیری بر کارکرد تابع expon() نخواهد داشت.

> expon<- FUNCTION (x) x*x

> expon(4)

[1]16

توابع r خود می توانند آبجیکت برای توابع دیگر باشند. به عنوان مثال دو تابع mean() و  print() را در نظر بگیرید که به صورت print(mean(x)) نیز قابل به کارگیری هستند ( همان گونه که ملاحضه می شود تابع mean() خود آبجکت تابع print() شده است ).

نکته: متغیر ها که درون یک تابع ایجاد می شود تنها درون همین تابع وجود دارد و در خارج از تابع وجود خارجی نخواهند داشت. برای اینکه متغیر های داخلی یک تابع را حفظ کنیم از عملگر ->> استفاده می نمایم.

برای مشاهده محتویات یک تابع کافی است نام آن را (بدون پرانتز) وارد نماییم. به عنوان مثال، چنانچه exponرا وارد نمایید محتویات تابع expon() به صورت زیر نشان داده خواهد شد:

> expon

FUNCTION (x) x*x

برخی بیش از یک برهان دارند. در این گونه موارد بستع به ترتیب معرفی برهان ها در تابع می توانیم از کر نامه برهان ها خودداری نموده و تنها مقدار مورد نظر را در تابع قرار دهیم. به عنوان مثال، تابع myfunc() را به صورت زیر تعریف می کنیم. تا با استفاده از دو برهان x1 و x2 مقدار حاصلضرب آنها را در آبجکت z قرار دهد  و آن را برگرداند (return) چنانچه بخواهیم حاصلضرب x1=2 و x2=3 را توسط تابع myfunc() بدست آوریم می توانیم بنویسیم.

(()myfunc <- function(x1,x2)(z1<- x1*x2; return<

( myfunc (x1=2 , x2=3<

[1]6

یا چنانچه مقدار برهان ها را به ترتیب وارد نماییم نوشتن علات = ضروری نمی باشد:

> myfunc (2,3)

[1]6

همانگونه گونه مشاهده می شود نتیجه هر دو حالت کاملاٌ یکسان است.

مثال1: می خو.اهیم تابعی تعریف نماییم که داده ها را به توان دلخواه برساند.

>make.power <- function(n) {

Power <-function(x){

X^n

}

Power

}

 

همانگونه که مشاهده می شود تابعی درون تابعه دیگر ایجاد شده است برای این داده ها به توان 2 و 3 و یا 4 برساند، به صورت زیر می نویسیم و نام آنها را به دلخواه ( به ترتیب quare,cubeوquad) تعریف می نماییم.

Square <- make.power(2)

>cube <- make .power(3)

>quad <- make.power(4)

اینکه می توانیم داده ها را با استفاده از توابع مناسب به توان دلخواه برسانیم.

>square (4)

[1]16

>cube(3)

[1]27

.quad(2)

[1]16

مثال 2: می خواهیم تابعی تعریف کنیم تا بتواند مقدار t را برای مقایسه میانگین دو جامعه محاسبه نماید. همان گونه که مشاهده می شود برای این کار از برخی توابع داخلی r نظیر length()،mean()،var() و sqrt() استفاده می شود.

>ttest2<- function (y1,y2){

n1<-length(y1); n2<-length(y2)

my1<- mean(y1); my2<- mean(y2)

v1 <-var(y1); v2 <- var(y2)

s<-((n1-)*v1+(n2-1)*v2)/(n1+n2-2)

tst <- (my1-my2)/ sqrt(s*(1/n1+1/n2))

tst

}

اینک تابع ttest() را مورد استفاده قرار می دهیم. فرض کنید جامعه اول شامل اعداد 3،4 و5 و جامعه دوم شامل اعداد 7،9،25 و15 باشد. برای مقایسه میانگین این دو جامعه به صورت زیبر عمل می کنیم.

>y1 <-c(3,4,5)

>y2<-c(7,9,25,15)

> ttest2(y1,y2)

[1]-2.080626

 

البته می توانیم اعداد مربوط به هر جامعه را مستقیماٌ درون تابع قرار دهیم.

>ttest2(c(3,4,5),c(7,9,25,15))

[1]-2-080626

 

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

>myline <- function( slope){

X<-0

Y<-0

Point <-10

X<-1:points

For (i in 1:10){

Y(i)<-slope*x[i]

{

Polt(x˜y,type="n")

Abline(lm(y˜x))

}

تابع myline()که در ایجاد آن از توابع داخلی plot() و aline() کمک گرفته شده است نمودار خط رگرسیون یا شیب دلخواه را نمایش می دهد.تابع را برای شیب دلخواه 1،3  به کار می بریم.

(>myline(1,3

مثال 4:قصد داریم تابع با نام environment بنویسیم که در محیط دایره را محاسبه نمایند. برهاناین تابع شعاع دایره (radius) است:

}( environment <- function(radius<

X <- 2*pi*radius

(Retur(nx

}

در اینجا تابعی از اعداد Pi(3,141593) مورد استفاده شده است. در زیر تابع environment()استفاده شده تا محیط دایره ای با شعاع 3 سانتی متر را محاسبه نمایند:

(environment (3<

[1] 18.84956

 

توابع کنترل کننده:

توابع دیگری وجود دارد که به کاربر امکان می دهد تا در هر مرحله کارکرد یک تابع را مورد بررسی قرار دهد. این توابع تاٌثیری بر عملکرد تابع ندارد و به کاریگیری آنها اختیاری و از جنبه کنترل بیشتر تابع می باشد. مهمترین این توابع کنترلی return(),stop() و warning() می باشد.

با استفاده از تابعreturn() می توان هر عبارتی در تابع که دارای یک خروجی عددی می باشد را کنترل نمود. تابع return() آخرین عدد حاصل را بر میگرداند. چنانچه تابع return() استفاده نشود عدد حاصل از اجرای آخرین سطح تابع(برنامه) برگردانده می شود. مثال زیر با استفاده از تابع return() منجر به ارائه خروجی در برنامه می گردد.

U <- 1

V <- 2

Myfunc1 <- function(x){

Y <- u

Y <- y+3

U <- x

Sum <- x+y+u+v

}

>myfunc1(5)

[1]16

همانگونه که مشاهده می شود تابع return() آبجکت sum که مجموع x+y+u+v است بر می گرد اند. چنانچه از این تابع استفاده نشود برنامه فاقد خروحی خواهد بود در مثال زیر زیر نتیجه حذف تابع return() در برنامه بالا کاملاٌ محسوس خواهد بود.

تابع(برنامه) برگردانده می شود. مثال زیر با استفاده از تابع return() منجر به ارائه خروجی در برنامه می گردد.

U <- 1

V <- 2

Myfunc2 <- function(x){

Y <- u

Y <- y+3

U <- x

Sum <- x+y+u+v

}

>myfunc2(5)

 حتی با فراخوانی آبجکت sum نیز نتیجه حاصل نخواهد شد زیرا این یک آبجکت داخل تابع است و توسط r شناخته       نمی شود چنانچه sum را فراخوانی نمایید پیغام خطای زیر را مشاهده خواهد کرد:

>sum

Function(...,narm = FALSE) . primitive("sum")

تابع stop() در هرمرحله ای از تابع که استفاده شود عملکرد تابع را متوقف نموده و یک پیغام دلخواه را نمایش خواهد داد    در مثال زیر تابع  stop() به کار گرفته شده است تا در صورتی که شرط  (x<0) برقرار باشدپیغام دلخواه که داخل علامت نقل دوتایی ("") قرار گرفته است را ارائه دهد(سطر u)

>prnt <- function(x){

If (x>=0) print(x) else stop(" this function works well !! ut x is smaller than 0")u

}

>prnt(3)

[1]3

>prnt(-3)v

Error in prnt(-3): this function works well !! ut x is smaller than 0

همانطور که مشاهده می شود در صورت برقرار بودن شرط تابع stop() عمل نموده پیغام خطا نمایش داده می شود       (سطر v) بدینترتیب می توان کارکرد بدین ترتیب می توان کارکرد تابع را متوقف ( کنترل ) نمود.

تابع warning() به کاربر امکان می دهد که پیغام را بدون این که که خللی در اجرای برنامه ایجاد گردد نمایش دهد. دربرنامه به محض رسیدن به تابع warning() پیغام داخل علامت نقل قول دوتایی را نمایش داده و برای ارائه برنامه به سطر بعدی میرود در مثال زیر که همان مثال زیر که همان مثال قبلی است اضافه کردن تابع warning() منجر به نمایش پیغام دلخواه در صورت رسیدن برنامه به سطر این تابعه می باشد.

>prnt <- function(x){

If (x>=0) print(x) else stop(" this function works well !! ut x is smaller than 0")

warning("this function works well for valuse more thane 0")

}

با اجرای تابع برای مقادیر 20 و 20- نحوه عمل تابع warning() مشخص می گردد.

>prnt(20)

[1]20

Warning message:

In prnt(20): this function works well for valuse more thane 0

>prnt(-20)

Error in prnt(-3): this function works well !! ut x is smaller than 0

مشاهده می شود تنها در شرایطی که برنامه به سطر تابع warning() برسد پیغام مورد نظر نمایش داده می شود بدین ترتیب کاربر می تواند نسبت به خوانده شدن سطر های برنامه توسط نرم افزار اطمینان حاصل نماید و برنامه مورد کنترل دقیق قرار دهد.

نظرات

هیچ نظری وجود ندارد.


افزودن نظر

Sitemap
Copyright © 2017 - 2023 Khavarzadeh®. All rights reserved