สัญลักษณ์ และการกำหนดค่า สัญลักษณ์ ของ R
Symbols and Assignments
R Symbols
เมื่อเราสร้างตัวแปรใหม่ จะต้องมีชื่อที่ปกติแล้วจะอ้างถึงค่าหนึ่ง ชื่อนั้นจริงแล้วคือสัญลักษณ์หนึ่ง ซึ่งหาค่าคืนกลับมาได้ สัญลักษณ์หนึ่งถือว่าเป็นออฟเจคของ R ด้วยอย่างหนึ่ง และสามารถนำไปจัดการแนวทางเดียวกับเป็นออฟเจค สัญลักษณ์ที่อ้างถึงเป็น ออฟเจค R อย่างหนึ่งและเป็นชื่อของออฟเจค R หนึ่งเป็นสัญลักษณ์อย่างหนึ่ง
ตัวอย่างต่อไปนี้แสดงสัญลักษณ์ “x” และค่า “6” ที่ถูกกำหนดหรือเกี่ยวพันธ์กันสัญลักษณ์หรือตัวแปร
x <- 6
x
[1] 6
เรายังสารมารถใช้สัญลักษณ์เพื่อสร้างฟังก์่ชัน ในอีกทางหนึ่ง ฟังก์ชันสามารถที่จะกำหนดให้กับสัญลักษณ์ แต่ไม่จำเป็น สัญลักษณ์ในฟังก์ชันสามารถเป็นปิดหรือเปิด (bound or unbound). มีสัญลักษณ์ 3 ชนิดภายในฟังก์ชัน ได้แก่ฟอมอลพารามีเตอร์ หรือฟอมอลอาร์กูเมนต์(formal parameters หรือ formal arguments) ตัวแปรโลคอล( local variable) และตัวแปรอิสระ(free variables) ฟอมอลอาร์กูเมนต์ภายในฟังก์ชันหนึ่งเรียกว่าเป็นสัญลักษณ์ที่บาว(bound symbols) ที่มีอยู่ภายในตัวของฟังก์ชัน สัญลักษณ์อื่นทั้งหมดในตัวของฟังก์ชั้นไม่เป็นโลคอลก็เป็นตัวแปรอันบาว เนื่องจาก R เป็นภาษาแบบนิพจน์ ที่ตัวยกให้ผลต่างกับปกติ(case sensitive) เราจำต้องระมัดระวังเมื่อใช้สัญลักษณ์ที่แตกต่างกัน ดังเช่นชื่อตัวแปร เราควรจะพิจารณาชนิดของระบบปฏิบัติการที่ใช้และประเทศที่เราอาศัยเมื่อใช้ชุดสัญลักษณ์ของR ตามปกติสัญลักษณ์ตัวเลขอักขระ(alphanumeric) ดังเช่นจุด(periods (.) และขีดล่าง(underscores (_)) สามารถนำมาใช้ได้ อย่างไรก็ตามยังมีข้อจำกัดอยู่บ้าง ชื่อหนึ่งๆจะต้องเริ่มต้นด้วยจุด(period) หรือตัวอักษรตัวหนึ่ง ถ้าชื่อหนึ่งเริ่มด้วยจุดแล้วตัวอักขระตัวที่สองจะต้องไม่เป็นตัวเลข เราสมารถมีชื่อที่ไม่จำกัดความยาว ออฟเจคสามารถที่จะอ้างถึงได้ด้วยสัญลักษณ์ ซึ่งจริงแล้วป็นออฟเจค สัญลักษณ์หนึ่งๆ พิจารณาให้เป็นออฟเจคใน R. สัญลักษณ์สามารถใช้ในทางเดียวกับออฟเจคอื่นๆและพิจารณาให้เป็นตัวแปรเช่นกัน
ในสิ่งแวดล้อม มีสัญลักษณ์คู่ชุดของค่า (set of symbol-value pairs) และ R มองหาสัญลักษณ์ภายในเฟรมของสิ่งแวดล้อม สัญลักษณ์ภายในสิ่งแวดล้อมประกอบด้วย รายการค้นหา ที่ค้นหาตามลำดับสำหรับสัญลักษณ์ที่ตรงกันกับคำค้น ถ้าสัญลักษณ์นั้นถูกกำหนดตำแหน่งแล้วค่าให้มา ดังนั้น ถ้าเรากำหนดสิ่งแวดล้อมเดียวกันให้กับสัญลักษณ์จำนวนมาก และเปลี่ยนไปค่าหนึ่งจากทั้งหมด สัญลักษณ์อื่นๆที่เหลือก็จะเปลี่อยนแปลงไปด้วย เมื่อเราสร้างชื่อตัวแปรขึ้นมาตัวหนึ่ง เราปกติแล้วเป็นการสร้างสัญลักษณ์ตัวหนึ่ง ชื่อถือว่าเป็นสัญลักษณ์ ปกตแล้วชื่อนั้นจะมีค่าหนึ่ง ซึ่งเมื่อหารค่าจะได้ค่าคืนกลับมา ในตัวอย่างต่อไปนี้ “x” มีค่า ”3”, ที่ซึ่ง “x” คือสัญลักษณ์ และ “3” เป็นค่าของสัญลักษณ์. ค่านี้กำหนดให้กับสัญลักษณ์
> x <- 3
ค่าที่ถูกคืนกลับมาจากลูป “for”, “while”, และ “repeat” loops สามารถกำหนดผลลัพธ์ให้กับสัญลักษณ์ เช่นกันรายการของอาร์กูเมนต์หรือฟอมอลอากูเมนต์ในฟังก์ชันสามารถพิจารณาให้เป็นสัญลักษณ์ ในกรณีนี้ สัญลักษณ์กำหนดเป็นนิพจน์
R Assignments
การกำหนดค่าใน R ดำเนินการหาค่านิพจน์และผ่านค่าให้กับตัวแปร อย่างไรก็ตามผลลัพธ์ไม่ได้แสดงให้เห็นโดยอัตโนมัติ เราจำเป็นต้องเรียกใช้ชื่อตัวแปรเพื่อดูผลลัพธ์ ใน R การกระทำทั้งหลายที่ทำใน R เป็นผลมาจากการเรียกใช้ฟังก์ชัน การเรียกใช้ฟังก์ชันคืนค่าหนึ่งและมักจะต้องการชื่อหนึ่งที่จะถูกกำหนดค่านั้นให้ มีอยู่สองแนวทางที่เราสามารถกำหนดค่าหนึ่งๆ เราสามารถกำหนดค่าหนึ่งโดยใช้เครื่องหมายกำหนดค่า (assignment operator) ประ กอบด้วยเครื่องหมายน้อยกว่าและเครื่องหมายลบด้วยกัน(<-) และเครื่องหมายเท่ากับ(=) เป็นเครื่องหมายกำหนดค่าใช้ในการกำหนดค่าให้กับชื่อตัวแปร ตัวกระทำเท่ากับ = เป็นทางเลือกนอกจากเครื่องหมายกำหนดค่าน้อยกว่าและเครื่องหมายลบ ตัวกระทำ <- สามารถนำมาใช้ที่ใดๆใน R, แต่ตัวกระทำเครื่องหมาย = สามารถมาใช้ได้เฉพาะในนิพจน์ที่นำเข้าที่บรรทัดคำสั่งหรือในส่วนของนิพจน์ที่ใช้วงเล็บ ตัวกระทำทั้งสองชี้ไปที่ออฟเจคที่รับค่าในนิพจน์ และที่ได้ถูกกำหนดให้สิ่งแวดล้อมที่ซึ่งนิพจน์ได้ถูกหาค่าไว้
ต่อไปเป็นตัวอย่างหนึ่งที่เราสามารถสร้างการกำหนดค่าอย่างไรด้วยเครื่องหมายตัวกระทำกำหนดค่า (<-)
> squarey <- sqrt(x*x+2)
และต่อไปเราสร้างการกำหนดค่าอย่างไรด้วยเครื่องหมายเท่ากับ (=).
> squarey = sqrt(x*x+2)
ในทั้งสองกรณี ค่าของนิพจน์“sqrt(x*x+2)” ถูกเก็บไว้ในชื่อตัวแปร“squarey”. เมื่อตัวแปร “squarey” สั่งให้ทำงาน ตัวแปรจะกลายเป็นออฟเจคภายในสิ่งแวดล้อม ไม่จำเป็นต้องคำนึงถึงว่าสัญลักษณ์การกำหนดค่าใดที่เราใช้ ขึ้นอยู่ดับเรา บนฐานของความถนัดและชอบที่จะเลือกใช้อย่างหนึ่งอย่างใด เพียงแต่จำไว้ว่า R นั้นให้ผลต่างกันกับตัวพิมพ์เล็กและใหญ่ ดังนั้นถ้าเราใช้ “squareY”
, มันจะแตกต่างจาก“squarey”. ชื่อทั้งสองเหล่านี้แตกต่างกันตามการรับรู้ของ R. เราควรจะระวังว่า R จะไม่แสดงข่าวสารใดออกมาเมื่อเรากำหนดค่าให้ตัวแปร เราไม่จำเป็นต้องนำเข้าชื่อของตัวแปรที่บรรทัดคำสั่งและกด
ตัวอย่างเช่น ถ้าราต้องการแสดงผลลัพธ์ เราจำต้องทำดังต่อไปนี้:
squarey <- sqrt(1*2+2)
squarey
[1] 2
หลังจากกำหนดค่าให้ตัวแปรแล้ว เราเรียกโดยอ้างถึงชื่อตัวแปรนั้นเพื่อแสดงค่าที่กำหนดให้ตัวแปรนั้น ประโยคคำสั่งการกำหนดค่าอาจรวมเอานิพจน์เดี่ยวโดยไม่มีฟังก์ชัน ต่อไปเป็นตัวอย่างหนึ่งของการกำหนดค่าด้วยนิพจน์เดี่ยว
y <- 10 + 2
การกำหนดค่าสามารถทำได้อีกวิธี โดยการเปลี่ยนทิศทางของเครื่องหมายตัวกระทำจากน้อยกว่าและลบไปเป็น rs (<-) ไปเป็น เครื่องหมายลบและมากกว่า (->). การกำหนดค่าด้วยตัวกระทำในอีกทิศทางอาจดูคล้ายกับประโยคคำสั่งต่อไปนี้
> 10 + 2 -> y
การกำหนดค่าทำการหาค่านิพจน์และส่งผ่านค่าไปให้ตัวแปร แต่ไม่จะเป็นต้องแสดงผลหรือพิพม์ออกมาให้เห็นโดยอัตโนมัติ
ประโยคคำสั่งการกำหนดค่าด้วยฟังก์ชันสามารถที่จะมีจำนวนอาร์กูเมนต์เท่าใดก็ได้ ตัวอย่างต่อไปนี้แสดงประโยคคำสั่งกำหนดค่าที่มีหลายอาร์กูเมนต์ โดยแสดงฟังก์ชันw() ด้วยเลข 4 จำนวน
> x <- w(23, 3, 4, 1)
ตัวกระทำกำหนดค่า(<-) ในกรณีนี้สามารถแทนได้ด้วยเครื่องหมายการกระทำเท่ากับl (=) หรือการกำหนดค่าสามารถใช้ได้กับฟังก์ชันกำหนดค่า assign() การทำเช่นนี้เป็นเหมือนกับประโยคคำสั่งกำหนดค่า ด้วยฟังก์ชัน w() ตัวอย่างต่อไปนี้แสดงให้เราเห็นการใช้ฟังก์ชัน assign() อย่างไร นีเป็นวิธีการทางเหลือกหรือวิธีที่สมนัยเท่าเทียมกันกับฟังก์ชัน w()
> assign(“x”, f(23, 3, 4, 1))
ตัวกระทำกำหนดคค่าทางซ้ายมือ(<-) พิจรณาเป็นแลบลัดสั้นในการใช้ฟังก์ชัน assign() ตามที่ได้เรียนรู้มาแล้ว ตัวกระทำกำหนดค่าสามารถใช้ในทิศทางตรงข้าม ตัวอย่างเช่นแทนที่จะใช้ตัวกระทำกำหนดค่าทางซ้าย (<-), เราสามารถใช้ตัวกระทำกำหนดค่าทางขวา ตัวอย่างต่อไปนี้แสดงให้เราเห็นการใช้ตัวกระทำกำหนดค่าทางขวา(->) สำหรับฟังก์ชันw()
> w(23, 3, 4, 1) -> x
การกำหนดค่าด้วยฟังก์ชัน ตัวกระทำกำหนดค่า<<- และ->> ถูกนำมาใช้เพื่อสร้างการกำหนดค่าด้วยฟังก์ชันเท่านั้น ยังคงมีการใช้สำหรับการค้นหาสำหรับนิยามที่เหมือนกันด้วยชื่อตัวแปรเดียวกันภายในสิงแวดล้อมพ่อแม่ (parent environment) ถ้าพบตัวแปรและไม่ได้ถูกล็อกไว้ แล้วค่านั้นถูกกำหนดอีกครั้ง ถ้าตัวแปรหาไม่พบการกำหนดค่าจะใช้สิ่งแวดล้อมแบบโกรบอล(global environment) ในการใช้ตัวกระทำ<<- เราคงจะพิมพ์คำสั่งดังตัวอย่างต่อไป
y <<- mean(10 + 2)
สำหรับการใช้ตัวกระทำ ->> เราคงจะพิพม์ตามตัวอย่างต่อไป:
mean(10 + 2) ->> y
หมายเหตุ: การกำหนดค่าใดๆที่ได้กระทำภายในฟังก์ชันนั้นเป็นแบบโลคอลและชั่วคราว (temporary) หมายความว่า จะสูญเสียค่าไปเมื่อผู้ใช้ออกจากฟังก์ชัน ดังนั้นการกำหนดค่า Y <- sqrt(Y) จะไม่ส่งผลต่อค่าอาร์กูเมนต์เมื่อเรียกใช้ฟังก์ชัน.
การกำหนดค่า ซุปเปอร์ ซับเซ็ต และ คอมเพล็กซ์
Super, Subset and Complex Assignments
ตัวกระทำกำหนดค่าซุปเปอร์ใช้ในการสร้างการกำหนดค่าแบบถาวรและโกรบอลภายในฟังก์ชัน ตัวกระทำกำหนดค่าแบบซุปเปอร์ (<<-) หรือฟังก์ชัน assign9 ถูกใช้ภายใต้สถานะการณ์นี้ เมื่อมาถึงการกำหนดค่าซับเซ็ต มีความซับซ้อนในกรณีเฉพาะ ประโยคคำสั่งต่อไปนี้คือตัวอย่างของการกำหนดค่าแบบซับซ้อน(complex assignment
x[1:4] <- 22:12
ผลลัพธ์จากประโยคคำสั่งคล้ายคลึงกับต่อไปนี้
‘*prm*‘ <- x
x <- "[<-"(‘*prm*‘, 1:4, value=22:12)
val(‘*prm*‘)
ในประโยคคำสั่งข้างบน เราจะเห็นว่า index ถูกแปลงไปเป็นnumeric index หนึ่ง และแล้วแทนที่ด้วย sequential numeric index. ตัวแปรที่ปรากฏ “*prm*” จะถูกเขียนับและลบออกไป แต่ชื่อตัวแปรจะต้องไม่ใช้ในโค๊ด เราไม่จำเป็นต้องใช้open bracket ([) ด้วยตัวกระทำทางซ้าย เรายังสามารถเปลี่ยนตำแหน่งฟังก์ชันด้วยตัวกระทำกำหนดค่าทางซ้าย อาร์กูเมนต์ตัวสุดท้ายด้วยฟังก์ชัน val() คือค่าที่จะถูกกำหนด ตัวอย่างต่อไปนี้แสดงให้เราเห็นว่าใช้ฟังก์ชันในตำแหน่งใหม่อย่างไร
numbers(x) <- c("a","b")
ผลลัพธ์จากประโยคคำสั่งฟังก์ชันคล้ายคลึงกับต่อไปนี้
‘*prm*‘ <- x
x <- "numbers<-"(‘*prm*‘, value=c("a","b"))
val(‘*prm*‘)
การกำหนดค่าแบบคอมเพล็กสามารถหาค่าย้อนกลับแบบเนสท์ (recursively with nesting) ต่อไปคือการกำหนดค่าแบบซับซ็อนที่ใช้การเนสท์(nesting):
numbers(x)[4] <- “Four”
ประโยคคำสั่งนี้คล้ายคลึงกับต่อไปนี้:
‘*prm*‘ <- x
x <- "numbers<-"(‘*prm*‘, value="[<-"(numbers(‘*prm*‘), 4, value="Four"))
val(‘*prm*‘)
เราสามารถใช้การกำหนดค่าซุปเปอร์แบบดับเบิลทางซ้าย(double left super assignment (<<-)) นอกจากที่เป็นการกำหนดค่าแบบเดี่ยวทางซ้ายเดี่ยว(single left single assignment
(<-)) เพื่อสร้างการกำหนดค่าแบบคอมเพล็กซ์
numbers(x)[4] <<- “Four”
ประโยคคำสั่งนี้ตรงกันกับต่อไปนี้
‘*prm*‘ <<- get(x, envir=parent.env(), inherits=TRUE)
numbers(‘*prm*‘)[4] <- "Four"
x <<- ‘*prm*‘
val(‘*prm*‘)
สมัครสมาชิก:
ส่งความคิดเห็น (Atom)
โครงสร้างควบคุม ใน R
โครงสร้างควบคุม (Control Structures) โครงสร้างควบคุมใช้เพื่อควบคุมการไหลของประโยคคำสั่งที่ถูกสั่งให้ทำงานโดยตัวแปลของ R โดยรวมประโยคคำสั...
-
โครงสร้างควบคุม (Control Structures) โครงสร้างควบคุมใช้เพื่อควบคุมการไหลของประโยคคำสั่งที่ถูกสั่งให้ทำงานโดยตัวแปลของ R โดยรวมประโยคคำสั...
-
บทนำIntroduction การโปรแกรม R คืออะไร What is R Programming? ประวัติและภูมิหลังของR History and Background of R ใช้ R ทำอะไรบ้าง What...
-
Files Reading Files with Functions Read.table() function Variations of read.table() Read.csv() function Scan(...
ไม่มีความคิดเห็น:
แสดงความคิดเห็น