ภาษา R มีคุณสมบัติที่ดีสำหรับการกำหนดฟังก์ชั่นที่สามารถรับจำนวนตัวแปรของการขัดแย้ง ตัวอย่างเช่นฟังก์ชันdata.frame
รับจำนวนอาร์กิวเมนต์ใด ๆ และแต่ละอาร์กิวเมนต์กลายเป็นข้อมูลสำหรับคอลัมน์ในตารางข้อมูลผลลัพธ์ ตัวอย่างการใช้งาน:
> data.frame(letters=c("a", "b", "c"), numbers=c(1,2,3), notes=c("do", "re", "mi"))
letters numbers notes
1 a 1 do
2 b 2 re
3 c 3 mi
ลายเซ็นของฟังก์ชันรวมถึงจุดไข่ปลาเช่นนี้
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
{
[FUNCTION DEFINITION HERE]
}
ฉันต้องการเขียนฟังก์ชั่นที่ทำสิ่งที่คล้ายกันรับหลายค่าและรวมเข้ากับค่าส่งคืนเดียว (รวมถึงการประมวลผลอื่น ๆ ) เพื่อที่จะทำสิ่งนี้ฉันต้องหาวิธีที่จะ "แกะ" ...
จากข้อโต้แย้งของฟังก์ชั่นภายในฟังก์ชั่น ฉันไม่รู้จะทำยังไง บรรทัดที่เกี่ยวข้องในการกำหนดฟังก์ชั่นของdata.frame
คือobject <- as.list(substitute(list(...)))[-1L]
ซึ่งฉันไม่สามารถทำให้ความรู้สึกใด ๆ ของ
ดังนั้นฉันจะแปลงจุดไข่ปลาจากลายเซ็นของฟังก์ชันเป็นรายการได้อย่างไร
หากต้องการเจาะจงมากขึ้นฉันจะเขียนget_list_from_ellipsis
รหัสด้านล่างได้อย่างไร
my_ellipsis_function(...) {
input_list <- get_list_from_ellipsis(...)
output_list <- lapply(X=input_list, FUN=do_something_interesting)
return(output_list)
}
my_ellipsis_function(a=1:10,b=11:20,c=21:30)
แก้ไข
ดูเหมือนว่ามีวิธีที่เป็นไปได้สองวิธีในการทำเช่นนี้ พวกเขาเป็นและas.list(substitute(list(...)))[-1L]
list(...)
อย่างไรก็ตามทั้งสองนี้ไม่ได้ทำสิ่งเดียวกัน (สำหรับความแตกต่างให้ดูตัวอย่างในคำตอบ) ทุกคนสามารถบอกฉันได้ว่าความแตกต่างที่ใช้ได้จริงระหว่างพวกเขาคืออะไรและฉันควรใช้อันใด
list
และc
ฟังก์ชั่นทำงานในลักษณะนี้ แต่ทั้งคู่เป็นสิ่งพื้นฐานดังนั้นฉันไม่สามารถตรวจสอบซอร์สโค้ดของพวกเขาได้ง่ายเพื่อทำความเข้าใจวิธีการทำงานของมัน