วันเสาร์ที่ 1 กุมภาพันธ์ พ.ศ. 2563

โปรแกรม R บทที่ 1

บทที่ 1 บทนำ

1. นำเข้าสู่การเรียนรู้ R

             R เป็นภาษาคอมพิวเตอร์ภาษาหนึ่งที่ใช้ในการคำนวณทางสถิติ ซึ่งมีความคล้ายคลึงกับภาษา S ที่พัฒนาโดย Bell Laboratories เริ่มแรกนั้นโปรแกรม R เขียนโดย Robert Gentleman ในกลางปี 1990  ตั้งแต่ปี1997 เป็นต้นมา  R ได้รับการดูแลและจัดการโดยทีมงานหลักที่พัฒนา R (R Development Core Team) โดยที่ R เป็นโปรแกรมแบบเปิด (open-source)ที่ผู้ใช้สามารถดาวน์โหลดมาใช้ได้ไม่ยาก โดยไม่เสียค่าใช้จ่าย และเป็นส่วนหนึ่ง ในโครงการของ GNU การใช้  R สามารถใช้ได้กับทั้งระบบปฏิบัติการ Unix, Macintosh และ Windows ข้อมูลต่างๆ เกี่ยวกับ R และตัวโปรแกรมสามารถดาวน์โหลดได้จากเว็บไซต์ http://www.r-project.org
            
R เป็นโปรแกรมที่ดีมากสำหรับใช้ในการเรียนรู้ทางสถิติ
เนื่องจากสามารถทำให้ผู้เรียนเกิดความเข้าใจในกระบวนการทางสถิติได้ดียิ่งขึ้น นอกจาก R จะเหมาะกับนัศึกษาเพื่อใช้ในการเรียนรู้ทางสถิติแล้ว R ยัเหมาะกันัวิจัที่ใช้สถิติอีกด้วย อีกทั้งยังเป็นโปรแกรมที่มีความยืดหยุ่นในการวิเคราะห์ทางสถิติ จึงทำให้ผู้ใช้สามารถขยายกระบวนวิเคราะห์ออกไปได้ตามความต้องการ 
2 ติดตั้งและเริ่มใช้ R
             เราสามารถดาวน์โหลด R ได้จาก CRAN (Comprehensive R Archive Network)ที่  
http://cran.r-project.org การติดตั้ง R สำหรับระบบปฏิบัติการวินโดว์ นั้นสามารถทำได้ไม่ยาก จากการ ดาวน์โหลดไฟล์ rwXXXX.exe เมื่อXXXX หมายถึง version ของ R ไฟล์นี้จะมีขนาดใหญ่กว่20 Mb  สมมุติดาวน์โหลดและบันทึกไฟล์ดังกล่าวไว้ที่เดสท็อป เรียบร้อยแล้ว ให้ดับเบิลคลิกที่ไอคอนไฟล์ที่ดาวน์โหลดไว้   R จะถูกติดตั้ง ทันที  เมื่อติดตั้ง R เรียบร้อยแล้ว เราสามารถเริ่มใช้งาน R ได้โดยดับเบิลคลิกไอคอนโปรแกรม R  จะปรากฏหน้าต่างที่พร้อมใช้งานได้   สำหรับโปรแกรม R จะมีการปรับปรุงราว 6 เดือนครั้งหนึ่ง ที่เราสามารถที่จะอัฟเดทเพื่อใช้งานลักษณะใหม่ๆ 

3 การใช้โปรแกรม R ในลักษณะต่างๆ
             3.1 การใช้ R เป็นเครื่องคิดเลข
             การใช้ R แบบง่ายๆแบบหนึ่งคือการใช้เสมือนเป็นเครื่องคิดเลข R จะใช้เครื่องหมายทางคณิตศาสตร์ที่เราคุ้นเคยกันดี อยู่แล้ว เช่น +, -, * และ / และใช้เป็นเครื่องหมายของการยกกำลัง ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้ R เป็น เครื่องคิดเลข
> 2+2
[1]   4
> 2^2
 [1]   4
> (1-2)*3
[1]   -3
>
-2*3
 [1]  -6
             ผลที่ได้จากการคำนวณจะปรากฏในบรรทัดถัดมาพร้อมด้วย [1] (จะอธิบายถึงสัญลักษณะนี้ต่อไปในเรื่องของ data vector)  
             Functionsใน R นั้มีฟังก์ชัทางคณิตศาสตร์และสถิติที่เราสามารถนำมาใช้ได้มากมาย และมีวิธีใช้ที่คล้ายคลึงกั เวลาใช้เราจะพิมพ์ชื่อของฟังก์ชันที่ต้องการใช้ ตามด้วยวงเล็บ, ( ) ซึ่งในวงเล็บนี้เราจะใส่ arguments เข้าไป ดังตัวอย่างต่อไปนี้แสดงการใช้ฟังก์ชันใน R
> sqrt(2)
[11.414214
> sin(pi)
[11.224606e-16
> exp(1)
[12.718282
> log(10)
[12.302585
             ฟังก์ชันหลายฟังก์ชันใน R มี argument ที่นอกเหนือจากที่ใช้ไปแล้ว ซึ่งทำให้เราสามารถเปลี่ยน defualt ที่กำหนดไว้ ในฟังก์ชันได้ เช่น เนื่องจากฟังก์ชัน log() นั้นโดย default แล้วเป็น log ฐานe แต่ถ้าเราต้องการใช้ log ฐาน 10 สา มารทำได้ดังนี้
> log(10,10)
[1
> log(10,base=10
[11
             สำหรับคำสั่แรกจะใช้ได้เมื่อเราทราบอยู่แล้วว่argument ที่สองเป็นการกำหนดฐานของ log ในคำสั่งที่สองเราใช้ named argument, base=, บอกให้ฟังก์ชันทราบว่าเราต้องการใช้ log ฐาน 10 แบบแรกนั้นมีประโยชน์คือประหยัดเวลา ในการพิมพ์ แต่ในแบบที่สองนั้นง่ายต่อการจำและการอ่าน        
             3.2 การกำหนดค่า (Assignment)
             โดยทั่วไปเราต้องการกำหนดค่าให้กับชื่อบางค่าเพื่อนำไปใช้ในคราวต่อไปได้โดยไม่ต้องพิมพ์ค่านั้นอีก เช่น
> x=2
> x+3
 [1]  5
> e=exp(1)
> e^2
[1]  7.389056
      
       การกำหนดชื่อตัวแปรนั้นสามารถใช้ได้ทั้งตัวอักษร ตัวเลข และ "." หรือ " " แต่ไม่สามารถใช้เครื่องหมายของการ คำนวณทางคณิตศาสตร์ เช่น +, -, *, / ได้  ตัวอย่างของการตั้งชื่อตัวแปร
> x=2
> n
=25
> a
.really.long.number = 123456789
> AReallySmallNumber
= 0.000000001
             การตั้ชื่อตัแปรนั้  การใช้ตัอัษรตัใหญ่หรือตัวเล็ก 
Rจะถือว่าไม่ใช่ตัวแปรเดียวกัน
             3.3
การใช้คำสั่ง c() เพื่อนำเข้าข้อมูล (Using c
() to Enter Data)
            
โดยปกติข้อมูลชุดหนึ่งมักประกอบด้วยค่าจากการสังเกตหลายค่า และเราสามารถอ้างอิงถึงค่าที่สังเกตเหล่านั้นโดยการใช้ อินเด็ก(index)  เช่นx1 ,x2 ,...,xn  (ตัวเลข อินเด็ก 1,2 ..n แยกให้เห็นถึงตัวแปรย่อย)  เมื่อ n เป็นจำนวนค่าครั้งที่สังเกต สมมุติว่าเรามีข้อมูลชุดหนึ่งประกอบด้วยค่าที่สังเกตดังนี้
2   5   4   3   6
เพื่อเก็บข้อมูลชุดนี้ใน
R เราใช้ เว็คเตอร์ข้อมูล (data vector) ซึ่งสามารถเก็บข้อมูลลักษณะนี้โดยใช้ c
() ดังนี้
> x = c(2,5,4,3,6)
> x
[1] 2 5 4 3 6
             เราสามารถแสดงค่าของข้อมูลโดยการพิมพ์ชื่อตัวแปรนั้น [1] เป็นการอ้างถึงค่าสังเกตที่ 1 ถ้าข้อมูลมีมากกว่าหนึ่งแถว ตัวเลขนี้จะอ้างถึงค่าสังเกตที่หนึ่งของแถวนั้นๆ  เราสามารถใช้ฟังก์ชัน c() ในการรวมเวกเตอร์ข้อมูลเข้าด้วยกันได้ เช่น
> x = c(1,2,3,4,5)
> y = c(6,7,8,9,10)
> c(x,y)
 [1]   1  2  3  4  5  6  7  8  9  10
             ข้อจำกัดอย่างหนึ่งของเวกเตอร์ข้อมูลคือค่าที่ อยู่ในเวกเตอร์ทั้งหมดต้องเป็นข้อมูลประเภทเดียวกัน ซึ่งอาจเป็น ตัวเลข(numeric) หรือข้อความ (characters string) ก็ได้ เช่น
> colour = c("red","green", "blue", "black", "white")

             3.4 การใช้ฟังก์ชันกับเว็คเตอร์ข้อมูล (Using Functions on a Data Vector)
             เมื่อเราเก็บข้อมูลในตัวแปรหนึ่งแล้ว เราสามารถใช้ฟังก์ชันกับตัวแปรนี้ได้ ฟังก์ชันเกือบทั้งหมดใน R สามารถทำงานได้กับเวกเตอร์ข้อมูล เช่น sum() จะหาผลรวมของค่าสังเกตทั้งหมดในเวกเตอร์ข้อมูล และ length() จะให้ค่าจำนวนค่า สังเกตทั้งหมดในเวกเตอร์ข้อมูล
> sum(x)
[1]  15
> length(x)
[1]  5
> sum(x)/length(x)
[1]  3
> mean(x)
[1]  3
             จากคำสั่งที่ ใช้แสดงให้เห็นว่าเราสามารถคำนวณหาค่าเฉลี่ยของข้อมูลได้โดยการใช้ค่าผลรวมของข้อมูลหารด้วยขนาดของข้อมูลก็ได้ หรือหาจากการใช้ฟังก์ชัน mean() ก็ได้  R มีฟังก์ชันสำเร็จรูปอยู่มากมายหลายฟังก์ชัน ฟังก์ชันอื่นๆที่ มีประโยชน์และควรทราบคือ sort(), min(), range(), diff() และ cumsum()
> sort(x)
[1]  1 2 3 4 5
> min(x)
[1]  1
> max(x)
[1]   5
> range(x)
[11  5
> cumsum
(x)
[1]     1  3  6  10  15
            นอกจากเราจะสามารถใช้ฟังก์ชันกับเวกเตอร์ได้แล้ว เรายังสามารถคำนวณกับเวกเตอร์ได้ด้วย เช่น
> weight.male = c(75, 80, 65, 95, 82)
> weight
.female = c(50, 60, 45, 48, 55)
> weight
.male + weight.female
[1]            125 140 110 143 137
> weight
.male - weight.female
[1]           25  20  20  47  27
> mean
(weight.male) - mean(weight.female)
[1]   27.8
ตัอย่างที่ 1.1 การเขียนโปรแกรมคำนวณค่าความแปรปรวนของข้อมูลชุดหนึ่ งจากสูตร
> x = c(2,3,5,7,11)

> xbar = mean(x)
> x
- xbar
[1] -3.6  -2.6  -0.6  1.4  5.4
>
(x - xbar)^2
[1] 12.96  6.76  0.36  1.96  29.16
> sum
((x-xbar)^2)
[1] 51.2
> n
= length(x)
>n
[1] 5
> sum((x-xbar)^2)/(n-1)
[1] 12.8
> var(x)                                    # use function var() to obtain the variance of x
[1] 12.8

             3.5 การสร้างข้อมูลแบบโครงสร้างCreating Structured Data
            ในบางครั้ข้อมูลของเรามีลัษณะที่เป็นรูปแบบบางอย่าง เช่น เป็นเลขจำนวนเต็ม 1 ถึง 99 เพื่อเก็บข้อมูลแบบนี้ R ทีละค่าเป็นการเสียเวลามาก อย่างไรก็ตาม R มีวิธีเก็บข้อมูลชนิดนี้ด้ง่ายๆดันี้
ข้อมูลการจัดลำดับอย่างง่าย (Simple sequences)  ถ้าค่าของข้อมูลที่ต้องการเก็บมีค่าเป็นลำดัจาก 1 ถึง 99 และ จาก 99 ถึง 1  โดยที่แต่ละค่าห่างกัเท่ากั 1   เขียนคำสั่งได้คือ
> 1:99 

[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 [51] 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 [76] 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
 > rev
(1:99)
[1] 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 [26] 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 [51] 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 [76] 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1


           ข้อมูลการจัดลำดับเลขคณิต (Arithmetic sequences)  
หากค่าของข้อมูลมีการเรียงลำดักัในรูปแบบทางคณิตศาสตร์ โดยมีค่าเริ่มต้นคือ a มีระยะ ห่างระหว่างแต่ละค่าคือ h และมีจำนวนทั้หมดเท่ากัn ลำดัคือ
a, a+ h, a+ 2h, a+ 3h, . . . , a+ (n-1)h
> a = 1;h=4; n=5
> a + h*(0:(n-1))
[1]    1    5    9   13   17
             เราสามารถใช้ฟังก์ชั seq() ในการสร้างเวกเตอร์ข้อมูลโดยการระบุค่าเริ่มต้นและค่าสุดท้าย พร้อมทั้ง      ระยะห่างของ แต่ละค่าได้ดันี้
> seq(1,9,by=2)                                                 # odd numbers
[1] 1  3  5  7  9
> seq
(1,10,by=2)                                              # as 11 > 10 it is not included
[1] 1  3  5  7  9
> seq
(1,9,length=5)                                           # 5 numbers only 
[1] 1  3  5  7  9

             ข้อมูลจัดจำนวนเลขซ้ำ(Repeated numbers) 
เมื่อเวกเตอรข้อมูลประกอบด้วยค่าที่ ซ้ำๆกัน เราสามารถใช้ฟังก์ชัน rep() ในการเก็บข้อมูลไดดังนี้
> rep(1,10)
[1]1111111111
> rep(1:3,3)
[1]   1  2  3  1  2  3  1  2  3
             รูปแบบของการเก็บข้อมูลที่มีลัษณะซ้ำๆกัที่ซัซ้อนขึ้ทำได้โดยการกำหนดคู่ของเวกเตอร์ที่มีขนาดเท่ากั ดันี้
> rep(c("long", "short"), c(1,2))                               # 1 long and 2 short
[1] "long" "short" "short
             3.6 ดำเนินการข้อมูลโดยใช้ดัชนี (Accessing Data by Using Indices)
             R เราสามารถเข้าถึงค่าสัเกตที่อยู่ในเวกเตอร์ข้อมูลได้ง่ายๆโดยใช้ [i] เมื่อ i คือ index ของข้อมูล เช่น ข้อมูลชุดหนึ่งประกอบดวย  x1 ,x2 ,...,xn เราสามารถเข้าถึงค่ าสังเกตแต่ ละค่าได้โดยใช้x[1],x[2],...,x[n] ตามลำดับ

> x = c(2,4,6,8,10)
> x
[2]
[1]  4
> x
[length(x)]
[1]  xx10
             เราสามารถเข
าถึงค่าสังเกตมากกว่าหนึ่งค่าได้พร้อมๆกันดังนี้
> x[1:3]
[1]   2  4  6
> x
[c(1,3,5)]
[1]   2  6  10
าเราต้องการเข้าถึงค่าในบางกรณี
> x[-1]                                    #ไม่เอาค่าที่ 1
[1] 4 6 8 10
> x
[-(1:3)]                              #ไม่เอาค่าที่ 1-3
[1]   8  10
> x
[c(-1,-3,-5)]                       #กำหนดที่ไม่มีลำดับที่ 1,3,5
[1]   4  8
             นอกจากที่กล่าวมาแล้ว เรายังสามารถเข้าถึงค่าสังเกตในเวกเตอร์ได้โดยการใช้ชื่อดังนี้
> x = 1:3
> names(x) = c("one", "two", "three")                     # set the names
> x["one"]
one
    1 
             3.7 การกำหนดค่าให้กับเว็คเตอร์ข้อมูล (Assigning Values to Data Vector)
             เราสามารถใส่ค่าของข้อมูลในแต่ละสมาชิกในเวกเตอร์ข้อมูลได้โดยการใช้  index โดยมีวิธีง่ายๆคือ  x[i] = a คำสั่นี้จะทำใหสมาชิกที่ i ของเวกเตอร์  x มีค่าเท่ากับ a  ถ้าหากสมาชิกที่ i มีค่ามากกว่าขนาดของ x[i] เดิมจะทำให้เวกเตอร์เพิ่มขนาดขึ้น
> x = c(2,4,6,8,10)
> x[1] = 3
>x
[1] 3  4  6  8  10
             นอกจากนั้นเรายังสามารถใส่ ค่ าของข้อมูลลงในเวกเตอร์ข้อมูลได้มากกว่ าหนึ่งค่าในคราวเดียวกัน ดังนี้       
> x[6:10] = c(12,14,16,18,20)                      # ใส่ค่าต่อจากค่าที่ 5 ไปถีงค่าที่ 10                
>x
[1] 3  4  6  8  10  12  14  16  18  20 
             าค่าของข้อมูลที่ต้องการใส่ลงไปในเวกเตอร์ข้อมูลมีจำนวนน้อยกว่า index ที่กำหนดไว้ (ขนาดของเวกเตอร์ใหญ่กว่า จำนวนข้อมูล)   R จะนำข้อมูลที่ใช้ไปแล้วมาวนใส่ลงในเวกเตอร์
             3.8 ค่าทางตรรก (Logical Values)
             การแสดงผลของ R ในรูปของ TRUE และ FALSE เรียกว่า นิพจน์ทางตรรก(logical expression) ใน R จะใช้คำ TRUE และ FALSE  เพื่อชี้ให้เห็นถึงสิ่งที่ถูกต้องตามเงื่อนไขหรือสิ่งที่ผิดไม่ตรงตามเงื่อนไข (สามารถใช้ T หรือ F แทนได้)
> x
[1] 3
 4  6  8  10  12  14  16  18  20
> x > 10
[1]
FALSE  FALSE  FALSE  FALSE  FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
> x
[x > 10]                                       # values bigger than 10
[1] 12 14 16 18 20
> which
(x > 10)                               # which indices บอกตำแหน่งข้อมูล
[1]   6   7   8   9  10

             งก์ชัน which() เป็นการบอกตำแหน่งของข้อมูลที่ มีค่าตรงตามเงื่อนไขในเวกเตอร์ข้อมูล    ยังมีฟังก์ชันอื่นๆอีกบางฟังก์ชันที่สามารถนำมาใช้ร่วมกับ logical vector โดยเฉพาะฟังก์ชัน sum() ซึ่งจะเป็นการรวมจำนวนค่าที่เป็น TRUE โดยให้ค่า TRUE เป็น 1 และให้ค่า FALSE เป็ น 0 ฟังก์ชันนี้มีประโยชน์มากในการหาจำนวนนับ (counts) และสัดส่วนข้อมูลให้เต็ม หรือหากจำนวนข้อมูลที่ต้องการใส่มากกว่า
> sum(x > 10)                                  # number bigger than 10 จำนวณที่มากกว่าค่า 10
[1]   5
> sum
(x > 10)/length(x)                  # proportion bigger than 10 สัดส่วนที่ค่ามากกว่า 10
[1]   0.5
             การสร้างเวคเตอร์ข้อมูลทางตรรกตามเงื่อนไข(Creating logical vectors by conditions)
             เราสามารถสร้าง logical vectors ได้โดยตรงโดยการใช้ c() หรือได้จากผลลัพธ์ที่เกิดจากการสร้างเงื่อนไข โดยมี logical operators คือ<, <=, >,=>,== และ! = ซึ่งเครื่องหมายส่วนใหญ่เรารู้จักกันดีอยู่แล้ว แต่มีบางเครื่องหมายที่เราอาจยังไม่เคยใช้ ได้แก่ == ใช้แทนเครื่องหมายเท่ากับ  ! = ใช้แทนไม่เท่ากับ ส่วนเครื่องหมาย! จะเปลี่ยนค่าของ ข้อมูลให้เป็น logical vector  
           นอกจากนั้นเรายังสามารถเปรียบเทียบ
logical vectors ได้โดยใช้ "and, &
" และ "or, | " การใช้เครื่องหมาย แบบนี้เป็นการเปรียบเทียบสมาชิกแต่ละสมาชิกในแต่ละเวกเตอร์ ผลของการเปรียบจะออกมาเป็นเวกเตอร์หนึ่ง  อีกรูปแบบหนึ่งของการเปรียบเทียบคือ && และ | | เพื่อตรวจสอบค่าจากซ้ายไปขวาจนกระทั่งได้ TRUE หรือ FALSE และผลที่ได้ จะได้ค่าเพียงค่าเดียว
> x = 1:5
> x < 5                                                                      # is x less than 5
[1]   
TRUE   TRUE   TRUE   TRUE   FALSE
> x > 1                                                                    # is x more than 1
[1]   
FALSE   TRUE   TRUE   TRUE   TRUE
> x > 1 & x <
5                                                      # is x bigger than 1 and less than 5
[1]   
FALSE   TRUE   TRUE   TRUE   FALSE
> x > 1 && x < 5                                                  # First one is false
[1]   
FALSE
> x > 1 | x < 5                                                        # is x bigger than 1 or less than 5
[1]   
TRUE   TRUE   TRUE   TRUE   TRUE
> x > 1 || x < 5                                                        # First one true
[1]   
TRUE
> x
== 3                                                                   # is x equal to 3
[1]   
FALSE   FALSE   TRUE   FALSE   FALSE
> x
!= 3                                                                     # is x not equal to 3
[1]   
TRUE   TRUE   FALSE   TRUE   TRUE
>
! x == 3                                                                   # not (x equal to 3)
[1]   
TRUE   TRUE   FALSE   TRUE   TRUE
             3.9 ค่าที่หายไป (Missing Values)
            ในบางครั้งขอมูลบางค่านั้นไม่สามารถหาค่าได้หรือสูญหายไป  ใน R จะใช้ค่า NA แทนค่าที่สูญหาย ในการทำงานของเวกเตอร์ข้อมูลที่มีค่า NA อยู่  R จะทำเสมือนว่าไม่มีค่านี้อยู่ในเวกเตอร์ เช่น การบวกกับค่า NA จะได้ค่าออกมาเป็น NA นั่นคือไม่สามารถบวกได้นั่นเอง สำหรับการตรวจสอบว่าในเวกเตอรอมูลมีค่าใดเป็น NA ทำได้โดยใช้ฟังก์ชัน is.na() เช่น
> y = c(0,1,0,NA,0,0)
> y
[1]   0   1   0  
 NA   0   0
> y > 0                                                                         # note NA is answer
[1]   
FALSE   TRUE   FALSE     NA    FALSE   FALSE
> is
.na(y)
[1]   
FALSE   FALSE   FALSE    TRUE   FALSE  FALSE
> mean
(y)                                                              # Cant add to get the mean
[1]
NA
> mean
(y,na.rm=TRUE)                                      # na.rm means remove NA
[1] 0.2
> mean
(y[!is.na(y)])                                            # hard way
[1] 0.2
             งก์ชันหลายฟังก์ชันใน R มี argument na.rm= ซึ่งสามารถเซตให้เป็น TRUE เพื่อกำจัด NA ออกไปได้ มีวิธีที่สามารถจัดการกับค่าที่หายไปได้อีกวิธีหนึ่งคือการใช้โครงสร้าง เช่น x[!is.na(x)]
             3.10 การจัดการสิ่งแวดล้อมการทำงาน(Manageing the Work Environment)
             เมื่อเราเปิดโปรแกรมและทำงานในโปรแกรมไประยะเวลาหนึ่ง เราจะพบว่ามีตัวแปรที่เรากำหนดไว้มากมายจนเราไม่ สามารถจดจำได้ทั้งหมด เราสามารถใช้ฟังกชัน ls() และ objects() แสดงตัวแปร, ฟังก์ชัน, และสิ่งอื่นๆทั้งหมดที่เรา ใช้บนหน้าจอได้
             หากเราต้องการลบตัวแปรหรือสิ่งที่เราใช้ออกไปเพื่อลดขนาดของ
work environment ลง สามารถทำได้โดยใช้ ฟังก์ชัน rm
()หรือ remove()
            3.11 การอ่านค่าข้อมูลจากแหล่งข้อมูลอื่น (Reading in Other Sources of Data)
             การป้อนค่าของข้อมูลลงใน R ทีละค่า หรือทุกครั้งที่ต้องใช้ข้อมูลชุดหนึ่งเป็นเรื่องน่าเบื่อ และยังทำให้เกิดความผิดพลาดได้ง่าย ถ้าข้อมูลชุดนั้นมีการเก็บไว้ในแฟ้มข้อมูลบางประเภทอยู่แล้ว เราควรใช้วิธีอ่านข้อมูลชุดนั้นเข้ามาใช้ วิธีอ่านข้อมูลเข้ามาใน R นั้นขึ้นอยู่กับชนิดของแฟ้มข้อมูลนั้น โดยทั่วไปข้อมูลที่มีอยู่บน web pages มักอยูในรูปของ text files, spreadsheets หรือโครงสร้างที่ใช้โปรแกรม R ได้
             การใช้ไลบรารีและชุดข้อมูลที่ให้มาใน R (Using Rs Built-in Libraries and Data Sets)
             R เป็นโปรแกรมที่ออกแบบมาให้มีเฉพาะส่วนที่สำคัญๆ และให้ทำงานร่วมกับฟังก์ชันที่สามารถเพิ่มเข้าไปในโปรแกรม ได้โดยฟังก้ชันเหล่านี้ได้มาจาก external packages ที่สำคัญกว่านั้นก็คือมี libraries มากมายที่ขยายออกไปจากฟังก์ชัน พื้นฐานที่มีอยู่ใน R ซึ่ง libraries และ packages ส่วนใหญ่นั้นจะได้มาพร้อมอยู่แล้วเมื่อเรา install โปรแกรม R ส่วนที่ นอกเหนือจากนี้สามารถ download ได้จาก http://WWW.r-project.org
             หากเราต้องการใช้  packages เหล่านี้ทำได้โดยใช้ฟังก์ชัน library() หรือ require() เช่น เราต้องการใช้ package pkgname ให้ใช้ library(pckname) สำหรับบนระบบปฏิบัติการ Windows เราสามารถเรียก packages ได้จาก menu bar  ใน packages ส่วนใหญ่มักมี built-in data sets อยู่ซึ่งเราสามารถเรียกดูหรือเรียกใช้ data sets เหล่านี้ได้ ดังนี้
> library(MASS)
> data
(survey)
หรือใช้
> data
(survey, package="MASS")
             แต่คำสั่งนี้จะไม่เรียก
help files มาให้ ซึ่งใน help files ของแฟ้มข้อมูลนั้นมักมีการอธิบายถึงลักษณะและความหมายของข้อมูลไว้ด้วย 
             การจัดการตัวแปรในชุดข้อมูล Accessing the Variables in a data set:$, attach(), and with()
             ในชุดข้อมูล(data set )ชุดหนึ่งอาจประกอบด้วยตัวแปรเพียงตัวเดียว หรือหลายตัวก็ได้ และมักเก็บอยู่ในรูปของ data frame มีลักษณะคล้าย spreadsheet นั่นคือแต่ละคอลัมน์คือตัวแปรหนึ่ง โดยที่แต่ละแถวคือข้อมูลของตัวอย่างหนึ่ง หรือ หน่วยทดลองหนึ่ง เราสามารถเข้าถึงค่าข้อมูลได้โดยชื่อของคอลัมน์โดยระบุชื่อของ data frame ก่อนดังนี้
> library
(MASS)
> names(geyser)
[1] "
waiting" "duration"
> geyser$waiting
  [1]  80  71  57  80  75  77  60  86  77  56  81  50  89  54  90  73  60  83
 [19]  65  82  84  54  85  58  79  57  88  68  76  78  74  85  75  65  76  58
 [37]  91  50  87  48  93  54  86  53  78  52  83  60  87  49  80  60   92  43
...
             การที่ต้องพิมพ์ชื่อ
data frame ทุกครั้งที่ต้องการเข้าถึงตัวแปรนั้นเป็นเรื่องเสียเวลาอย่างมาก มีวิธีหลายวิธีที่สามารถหลีกเลี่ยงปัญหานี้ได้ วิธีที่สะดวกที่สุดคือใช้ฟังก์ชัน attach() เพื่อบอกให้ R ทราบว่าเราต้องการทำงานกับ data frame นี้ และเราสามารถยกเลิกคำสั่งนี้ได้โดยใช้ detach() วิธีนี้เป็นวิธีที่ดีมากเมื่อเราทำงานโดยพิมพ์คำสั่งการทำงานต่างๆ บน R โดยตรง อย่างไรก็ตามวิธีนี้มีข้อเสียคืออาจก่อให้เกิดความสับสนได้ถ้าเราต้องการเปลี่ยนค่าในชุดข้อมูล หรือ ต้องการใช้ตัวแปรอื่นที่มีชื่อเดียวกันกับตัวแปรที่อยู่ในข้อมูลชุดที่เรา attach วิธีแกปัญหาคือใช้ฟังก์ชัน with() ซึ่งเป็ น การทำงานทั้ง attach() และ detach() ในคราวเดียวกัน โดยมีรูปแบบดังนี้
with(data.frame, command)
             สำหรับ
argument command นั้นสามารถประกอบด้วยหนึ่งคำสั่งหรือมากกว่าก็ได้ ถ้ามีมากกว่าหนึ่งคำสั่งให้คลุมคำสั่งเหล่านั้นด้วยวงเล็บ ( )
> data(Sitka)                                # load data set, optional นำเข้าชุดข้อมูล
> names
(Sitka)                            # Variablse names ชื่อตัวแปร
[1] "size" "Time" "tree" "treat"
> tree
                                           # not visible
Error
: Object "tree" not found
> length
(Sitka$tree)                   # length
[1] 395
> with
(Sitka, range(tree))          # what is range
[1]
 1  79
> attach
(Sitka)
> summary
(tree)
Min
.   1st Qu.   Median    Mean  3rd Qu.    Max.
    1          20           40           40         60         79

            วิธีการอื่นสำหรับการนำข้อมูลเข้า (Other Methods of Data Entry)
             1
.ตัดและวาง (Cut and Paste)
             หากเรามีข้อมูลที่ถูกเก็บไว้ในโปรแกรมอื่นๆ หรือไฟล์อื่นๆ เราสามารถใช้วิธี cut and paste ในการเก็บข้อมูลใน R หากข้อมูลนั้นมีแบ่งคอลัมน์ไว้แล้วเราสามารถ cut ข้อมูลที่ต้องการแล้วนำมาใส่ไว้ใน c() แต่ถ้าข้อมูลไม่มีการแบ่งคอลัมน์ไว้เราสามารถใช้ฟังก์ชันนี้ได้ อย่างไรก็ตามเราสามารถใช้ฟังก์ชัน scan() แทนได้ซึ่ง ฟังก์ชันนี้จะอ่าน ข้อมูลเข้ามาจนกระทั่งเราใส่บรรทัดว่างให้
            
2.การใช้ source() ในการอ่านข้อมูล Using source() to Read in R commands
             เราสามารถใช้ฟังก์ชัน
dump() เพื่อบันทึกค่ าของ R objects ลงใน text file ได้ เช่dump("x","somefile.txt") จะเขียนรายละเอียดของตัวแปร x ลงในไฟล์ชื่อ somefile.txt ที่ อยู่ในไดเรกทอรีที่ ทำงานอยู่ในขณะนั้น หากต้องการ ทราบว่าเรากำลังทำงานอยู่ ในไดเรกทอรีอะไรให้ใช้ฟังก์ชัน getwd()  หากต้องการเรียก output จากฟังก์ชัน dump() ให้ใช้ฟังก์ชัน source() ซึ่งจะช่วยให้เราถ่ายโอนชุดข้อมูลจาก session หนึ่งไปยัง session อื่นๆได้
             ฟังก์
ชัน source() สามารถใช้เรียกไฟล์คำสั่ (command file) ได้และทำงานเสมือนว่าเราพิมพ์คำสั่เหล่านั้นที่ prompt โดยตรง วิธีนี้ทำให้เราสามารถเขียนไฟล์คำสั่ที่ประกอบด้วยชุดคำสั่โดยใช้ text editor และอ่านคำสั่ เหล่านั้นเข้ามาใน R session เพื่อทำงานได้ นอกจากนั้นยังเป็นการง่ายต่อการแก้ไขคำสั่ที่ใช้ และยังสามารถ นำมาใช้ได้อีกในอนาคตอีกด้วย "
function(x) {cat("hello",x,"\n")}
งก์ชันที่แก้ไขใหม่นี้สามารถรับ argument ได้ เช่น
> hello("kitty")
hello kitty
            3.Reading Data From Formatted Data Sources
           
เรามัพบไฟล์ขอมูลที่มีรูปแบบที่ แน่นอนบางอย่าง เช่น ไฟล์ของข้อมูลที่ เป็นตัเลข, เป็นตารางของตัเลข หรือ เป็นไฟล์ที่แยกตัเลขแต่ละค่าด้วยเครื่องหมาย "," ซึ่ง R มีวิธีในการอ่านไฟล์แต่ละรูปแบบดันี้
            ถ
าข้อมูลชุดหนึ่งถูกเก็บไว้ในไฟล์ชื่อ "data.txt" โดยมีรูปแบบดันี้
            
74  122  235  111  292  111  211  133  156  79
            เราควรใช้ฟังก์ชัน
scan() ในการอ่ านไฟล์นี้ ดังนี้
> data = scan(file="data.txt")
Read 10 items
            สำหรัฟังก์ชัจะมีตัเลือก (options) ที่ช่วยให้เราสามารถอ่านไฟล์ที่มีรูปแบบบางอย่างได้ เช่นไฟล์ที่ใช้ ","  ในการแยกแตละค่าของข้อมูล, (sep=)  สำหรับข้อมูลที่อยู่ในรูปของตารางสามารถอ่านได้ด้วยฟังก์ชัน read.table() เช่น ในไฟล์ "data.txt" ประกอบด้วย ข้อมูลในรูปของตารางดังนี้
x y
74          55
122       64
235       78 
111       54
292      120
111      100
211      175
133      80
156      200
79         80
> read.table("data.txt", header=TRUE)
            x         y
1       74          55
2       122         64
3        235        78
4        111        54
5        292       120
6        111       100
7         211      175
8          133     80
9         156      200
10          79     80
argument header=TRUE หมายความว่าบรรทัดแรกของไฟล์คือชื่อของตัวแปรในแต่ละคอลัมน์


 1.4 การเขียนโปรแกรมใน R (Programming in R )
            อดีอย่างหนึ่งของ เมื่อเปรียบเทียบกับโปรแกรมสำเร็จรูปทางสถิติอื่นๆ คือ เป็นภาษาสำหรับการโปรแกรมซึ่ง มีไวยากรณ์(syntax) ที่แน่นอนและทันสมัย ทำให้เราสามารถเขียนฟังกชันที่ช่วยให้การทำงานของเราง่ายขึ้น และเรายังสามารถ ขยายฟังก์ชันของ ที่มีอยู่แล้วให้เหมาะกับงานของเราได้อีกด้วย
            1.4.1 การแก้ไขฟังก์ชัน (Editing Functions) 
            โดยปกติการเขียนโปรแกรมเป็นกระบวนที่ประกอบด้วยขั้นตอนต่างๆ และต้องมีการทำขั้นตอนเหล่านี้ซ้ำๆกันจนกว่าเราจะได้ผลที่น่าพอใจกระบวนการเหล่ านี้ได้แก่ การเขียนฟังก์ชัน การทดสอบฟังก์ชันที่เขียนขึ้นมา การหาความผิดพลาดในฟังก์ชัน การแก้ปัญหาที่เกิดขึ้น เพื่อให้การเขียนโปรแกรมง
ายขึ้นและทำให้เราสามารถให้ความสำคัญกับสิ่งที่สำคัญกว่าเราควรฝึกทักษะการเขียนโปรแกรมให้ดีก่อน  สำหรับการเขียนฟังก์ชันใน นั้นควรเขียนด้วยการใช้ text files ในโปรแกรม editor อื่นๆ เช่น Notepad เป็นต้น  นอกจากนั้นเราสามารถใช้ฟังก์ชัedit() ในการควบคุมฟังก์ชันจาก command line ได้ด้วย
            การใช edit() 
            เราจะแสดงวิธีใช้ฟังกชัedit() ด้วยตัอย่างง่ายๆ คือฟังก์ชั "hello world" โดยเริ่มจากการสร้าง ฟังก์ชั            บน command line ดังนี้
> hello = function() {cat("hello world\n")}
> hello()
hello world
>
ฟังก์ชันนี้เป็นคำสั่ให้พิมพ์ข้อความ "hello world" บนหน้าจอโดยใช้ cat() และ "\n" เป็นการสั่ให้พิมพ์โดยขึ้นบรรทัดใหม่  ถ้าเราต้องการที่จะแก้ไขฟังก์ชันนี้ทำได้โดยการใช้ฟังก์ชัedit() เพื่อใช้ editor ในการแก้ไข เราเรียก edit() ดันี้
> hello = edit(hello)                          "            #assign results of edit() back to hello
คำสั่นี้จะเปิด text editor สำหรับฟังก์ชัน "hello" ขึ้นมาเพื่อทำการแก้ไข หลังจากแก้ไขแล้วให้ save และ exit จาก editor
function() {cat("hello world\n")}
แก้ไขใหม่ได้เป็น
hello=function(x) {cat("hello",x,"\n")}
งก์ชันที่แก้ไขใหม่นี้สามารถรับ argument ได้ เช่น
> hello("kitty")
hello kitty 
            1.4.2 การใช้ฟังก์ชัน (Using Functions)
             งก์ชันใน R ถูกกำหนดด้วยส่วนต่างๆดังนี้
function (arguments) body
พิจารณาจากตัวอย่าง
hello = function(x) {
cat("hello",x,"\n")
}
             functionเป็keyword ที่ใช้โดยมี argument คือตัวแปรให้เป็น และมี bodyคือคำสั่ง cat("hello",x,"\n")
             อาร์กูเมนต์ของฟังก์ชัน(Function Arguments)
             เมื่อใช้ฟังก์ชันเรามักจะใส่ arguments ให้กับฟังก์ชันนั้นเพื่อให้ได้ผลลัพธ์ที่แตกต่างกันตาม argument ที่ใส่ไป การกำหนด argument ให้กับฟังก์ชันทำได้โดยการใช้ตัวแปรหนึ่งตัวแทนแต่ละ argument และแยกแต่ละ argument โดยใช้ เครื่องหมาย "," เช่น
arg1, arg2, arg3
             เมื่อกำหนดฟังก์ชันค่าโดยปริยาย(defualt) ของ argument สามารถกำหนดได้ดังนี้
arg1 = defualt1, arg2 = defualt2, arg3 = default3
             อย่างไรก็ตามเราไม่จำเป็นต้องกำหนด default ก็ได้ แต่ถ้าเรากำหนด default ไว้ เมื่อเราเรียกฟังก์ชันนั้นโดยไม่ใส่ argument ฟังก์ชันนั้นจะใช้ค่า default ในการทำงาน

ตัวอยางที่ 1.2 การสร้างฟังก์ชัน histrogram ของเราเอง
             เนื่องจากฟังก์ชัน hist() ใน R ไม่ค่อยสมบูรณนัก โดยปกติฮิสโทแกรมเป็นการศึกษาถึงแนวโน้มของการแจกแจง ของค่าสังเกต ดังนั้นหากเพิ่มเส้นโค้งความหนาแน่นในฮิสโทแกรมได้ก็จะเป็นประโยชน์มากขึ้น เราจะเริ่มสร้างฟังก์ชัน สำหรับสร้างฮิสโทแกรมของเราเองดังนี้
ourhist = function(x) {
hist(x,breaks="Scott", probability=TRUE)
lines(density(x))
}
             ในฟังก์ชันนี้เราใช้กฏของ "Scott" ในการกำหนด bins ลองใช้ฟังก์ชันนี้ดังนี้
> x = rnorm(100)
> ourhist(x)
จะแสดงผลกราฟดังนี้
\
                                                        รูปที่ 1.1
ปรากฏว่าฟังก์ชั่นนี้ทำงานได้ถูกต้อง  อย่างไรก็ตามเราต้องการเปลี่ยนข้อกำหนดของ break=? สามารถทำได้โดย กำหนด breaks = argument ดังนี้
ourhist = function(x,breaks="Scott") {
hist(x,breaks=breaks, probability=TRUE)
lines(density(x))
}
             เราสามารถเรียกฟังก์ชันนี้ได้ดังนี้
> ourhist(x)                                    # use defualt bin rule
> ourhist(x,"Sturges")                   # use different bin rule
             เราสามารถกำหนดสีให้กับกราฟได้โดยการแก้ไขฟังก์ชันได้ดังนี้
ourhist = function(x,breaks="Scott",col="purple") { hist(x,breaks=breaks, col=col,probability=TRUE) lines(density(x))

                                           
                                                รูปที่ 1.2

             สำหรัฟังก์ชันี้สีของกราฟที่เป็น default คือสีม่วง แต่เราสามารถเปลี่ยนสีของกราฟเป็นสีอะรก็ได้โดยการกำหนด argument ดังนี้ 
> ourhist(x,"Sturges","green")  
 จะได้กราฟตามรูปที่ 1.2
             Function Body and Return Values 
             Function body เป็นกลุ่มของคำสั่ที่ผู้เขียนฟังก์ชันกำหนดให้ทำงาน โดยการทำงานของคำสั่เหล่านี้จะทำตามลำดับ ของคำสั่ (line by line) การใช้ฟังก์ชันจะให้ผลลัพธ์ที่เกิดจากคำสั่สุดท้ายในฟังก์ชัน ซึ่งเราสามารถบังคับให้ฟังก์ชัน แสดงผลลัพธ์นี้ได้โดยใช้ฟงก์ชัreturn() ถ้าไม่ต้องการให้แสดงผลลัพธ์สามารถใช้ฟังก์ชัน invisible() แทนได้ภายในกลุ่มคำสั่งเราสามารถใช้ฟังก์ชั่น print() หรือ cat() เพื่อให้มีการแสดงผลออกทางหน้าจอได้  สำหรับใน Windows GUI การพิมพผลลัพธ์อาจถูกกำหนดเป็buffer เราสามารถใช้ฟังก์ชัflush.console()
             ในการแสดงผลลัพธ์ต่างๆที่เป็น
buffer ได้
ตัอยางที่ 1.3   EDA function (return values)
             คำสั่summary() เป็นคำสั่ที่ใช้ในการสรุปข้อมูลและให้ผลเป็นค่าสถิติต่างๆ อย่างไรก็ตามการใช้กราฟรูปแบบต่างๆในการสรุปข้อมูลก็เป็นสิ่งที่ดี ดันั้เราจะเขียนฟังก์ชัที่ให้ค่าสถิติต่างๆรวมทั้กราฟด้วย
eda = function(x) {
old.par = par(no.readonly = TRUE)        # See par examples
on.exit(par(old.par))
par(mfrow=c(1,3))                                  # 3 graphs
                                                                # 
hist(x,breaks="Scott", probability=TRUE,col="purple")
lines(density(x))
#                                               
                                                    


boxplot(x,horizontal=TRUE)                                # boxplot with points
rug(x)                                                                     # marked by rug()
qqnorm(x)                                                              # normal probability plot
                                                                                #
return(summary(x))                                                # return summary
}
             พิจารณา body ของฟังก์ชันeda() จะว่ามีการเซตให้par() ให้เป็นold.par และใช้ฟังกชันon.exit()
ทำงานเมื่อสิ่นสุดกระบวนการของฟังก์ชันนี้ ซึ่งในกรณีนี้จะทำให้ par() ถูกเซตกลับไปเป็นค่าเดิม คำสั่งmfrow=c(1,3) ในฟังก์ชันนี้เป็นการกำหนดให้สร้างกราฟ 3 รูป บนสกรีนเดียวกัน และคำสั่งสุดท้ายในฟังกชันใช้return() ในการแสดงผลของคำสั่งsummary()
             งก์ชันประเภทนี้มีประโยชน์อย่างมาก อย่างไรก็ตามเราสามารถปรับปรุงฟังก์ชันนี้ให้สามารถใช้งานได้กว้างขวาง ขึ้น เช่นฟงก์ชันนี้เขียนขึ้นเพื่อใช้กับข้อมู ลตัวแปรเดียว และเป็นตัวแปรเชิงปริมาณเท่านั้น หากเรามีตัวแปรที่ ต้องการ ศึกษามากกว่าหนึ่งตัวแปร หรือตัวแปรของเราเป็ นตัวแปรเชิงคุณภาพ หรือตัวแปรเชิงกลุ่ม เราควรเขียนฟังก์ชันที่ สามารถใช้กับตัวแปรเหล่านี้ได้ด้วย
> eda(rnorm(100)) 
Min.         1st Qu.      Median        Mean       3rd Qu.        Max.
 -2.88500  -0.49370    0.21170      0.08201     0.70710     3.81500

            การหาค่าเงื่อนไข Conditional Evaluation
             Rมีวิธีการจัดการกับกระบวนการแบบมีเงื่อนไขโดยการใช้ฟังก์ชัน if() มีรูปแบบ 2 รูปแบบคือ
            "
if-then"  form  
if
(condition) {
     statement(s) if condition is TRUE
}
             "if-then-else" form
if
(condition) {
     statement(s) if condition is TRUE
} else {
     statement(s) if condition is FALSE
}
 เงื่อนไขที่ ใช้ในฟังก์ชัน if() ต้องเป็น logical expression เช่น x > 0 หรือ x == y  เป็นต้น

สมมุติว่าเราต้องการปรับปรุงฟังก์ชัน eda() ที่เราเขียนไว้ในตอนต้น โดยต้องการให้ฟังก์ชันรับทราบถึงชนิดของ ตัวแปร ,x  เช่น ถ้า x เป็นปัจจัยหรือเป็นตัวแปรเชิงกลุ่ม ค่าสถิติที่ใช้ในการสรุปเกี่ยวกับตัวแปรนี้ก็จะแตกต่างจาก ข้อสรุปเมื่อ x เป็นตัวแปรเชิงปริมาณ วิธีง่ายๆที่สามารถทำได้คือการใช้เงื่อนไขในฟังก์ชัน เช่น
if (is.factor(x))
     ## do factor summary
} else if
(is.numeric(x)) {
     ## do numeric summary
} else {
      ## do a default summary
}
             การทำงานเป็นวงรอบ Looping 
การใช้ loop ใน R ทำได้ 3 รูปแบบคือ for(), while() และ repeat() สำหรับ repeat() ไม่ค่อยนิยมใช้จึง จะไม่กล่าวถึงในที่นี้
            
for()loops
             โครงสร้างของการเขียน for() คือ
for (varname in seq) {
       statement(s)
}
varname
คือชื่อของตัวแปร seq เป็นได้ทั้ง vector หรือ list และ statements จะทำงานสำหรับแต่ละค่าของ seq ตัวอย่างง่ายๆในการใช้  for() loop คือโปรแกรมการนับถอยหลัง
  
> for (i in 10:1) print(i)
อีกตัวอย่างหนึ่ งคือโปรแกรมการหาค่าของ n! = (n1) ×···×2 ×1
fact
= function(x) {
       ret = 1
      for (i in 1:x) {
              ret = ret*
      }
      return(ret)
}
           while() loops
การใช้ for() จะทำได้ก็ต่อเมื่อเราทราบจำนวนครั้งที่ต้องการทำซ้ำ แต่ในบางครั้งเราไม่ทราบว่าต้องทำซ้ำเท่าไรจึง จะได้ผลลัพธ์ที่ต้องการ ซึ่งวิธีที่ใช้คือเราจะทำซ้ำเมื่อเงื่อนไขที่กำหนดไว้ถูกต้อง เมื่อไรก็ตามที่เงื่อนไขผิดไปโปรแกรม จะหยุกการทำซ้ำทันที ฟังก์ชัน while() สามารถทำงานที่เราต้องการนี้ได้ โดยมีโครงสร้างคือ
while (condition)
         statement(s)
}
ตัวอย่างต่อไปนี้เป็นโปรแกรมนับจำนวนเหรียญที่ ขึ้นก้อยไปจนกว่าจะได้เหรียญเป็นหัวเหรียญแรก
tosscoin = function() {
     
 coin
= "tails"               # initialize condition
    
count
= -1                          # get counting reight this way
    
while
(coin == "tails") {
              coin = sample(c("heads","tails"),1)
              count = count + 1
}
     
cat
("There were",count,"tails before the first heads\n")
 }
บ่อยครั้งที่เราสามารถใช้ฟังก์ชัน while() และ for() แทนกันได้ เช่น เราต้องการเขียนโปรแกรมคำนวนค่า n! โดยใช้ while() สามารถทำได้ดังนี้
fact = function(x) {
       ret = 1
       while(x > 0) {
             ret = ret*x
            
x
= x-1
       }
       return(ret)
}
ทั้งสองโปรแกรมนี้ทำงานได้พอๆกัน ไม่ได้ประหยัดเวลามากกว่ากัน




ไม่มีความคิดเห็น:

แสดงความคิดเห็น