Ngôn ngữ R có một tính năng tiện lợi để xác định các hàm có thể có số lượng đối số thay đổi. Ví dụ, hàm data.frame
lấy bất kỳ số lượng đối số nào và mỗi đối số trở thành dữ liệu cho một cột trong bảng dữ liệu kết quả. Ví dụ sử dụng:
> 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
Chữ ký của hàm bao gồm dấu chấm lửng, như thế này:
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
{
[FUNCTION DEFINITION HERE]
}
Tôi muốn viết một hàm thực hiện một cái gì đó tương tự, lấy nhiều giá trị và hợp nhất chúng thành một giá trị trả về duy nhất (cũng như thực hiện một số xử lý khác). Để thực hiện điều này, tôi cần tìm ra cách "giải nén" ...
từ các đối số của hàm trong hàm. Tôi không biết làm thế nào để làm điều này. Dòng liên quan trong định nghĩa hàm data.frame
là object <- as.list(substitute(list(...)))[-1L]
, mà tôi không thể hiểu được.
Vì vậy, làm thế nào tôi có thể chuyển đổi dấu chấm lửng từ chữ ký của hàm thành một danh sách?
Để cụ thể hơn, làm thế nào tôi có thể viết get_list_from_ellipsis
mã dưới đây?
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)
Biên tập
Có vẻ như có hai cách có thể để làm điều này. Họ là as.list(substitute(list(...)))[-1L]
và list(...)
. Tuy nhiên, hai điều này không làm chính xác cùng một điều. (Để biết sự khác biệt, hãy xem các ví dụ trong câu trả lời.) Có ai có thể cho tôi biết sự khác biệt thực tế giữa chúng là gì không và tôi nên sử dụng cái nào?
list
vàc
chức năng đều hoạt động theo cách này, nhưng cả hai đều là nguyên thủy, vì vậy tôi không thể dễ dàng kiểm tra mã nguồn của chúng để hiểu cách chúng hoạt động.