Cách sử dụng `… '(dấu ba chấm hoặc dấu chấm-chấm) trong các hàm [trùng lặp]


84

Tôi có thể tìm tài liệu về cách sử dụng các ...hàm ở đâu? Ví dụ sẽ hữu ích.


3
Đối với người dùng python học R, một câu trả lời nhanh sẽ là ...là R tương đương với đầu vào từ khóa python của ( def func(**kwargs))
Anna

Câu trả lời:


75

Từ được sử dụng để mô tả ...là "dấu chấm lửng." Biết được điều này sẽ giúp tìm kiếm thông tin về cấu trúc dễ dàng hơn. Ví dụ: lần truy cập đầu tiên trên Google là một câu hỏi khác trên trang web này: Làm thế nào để sử dụng tính năng dấu chấm lửng của R khi viết hàm của riêng bạn?


3
Thực ra tên chính thức trong R được dots, ví dụ như các trang trợ giúp này được đặt tên ?dotsvà "tỉnh lược" thậm chí không được đề cập trên trang
MichaelChirico

Về tệp trợ giúp, ?dotskhông hoạt động đối với tôi, nhưng ?'...'có.
coip 12/09/19

54

Một ví dụ nhỏ để bạn bắt đầu.

f <- function(x, ...)
{
  dots <- list(...)                   #1
  if(length(dots) == 0) return(NULL) 
  cat("The arguments in ... are\n")
  print(dots)
  f(...)                              #2
}

f(1,2,3,"a", list("monkey"))

Hàm flưu trữ tất cả trừ đối số đầu vào đầu tiên trong biến dấu chấm lửng. Để truy cập nội dung của nó, dễ nhất là chuyển nó thành danh sách (1). Tuy nhiên, việc sử dụng chính là để truyền các đối số cho các hàm con, không yêu cầu chuyển đổi (2).


Tại sao trong # 2 lại gọi cùng một hàm f?
Jiapeng Zhang,

1
@JiapengZhang Đây là một ví dụ về một hàm đệ quy. f()được gọi nhiều lần với các đối số khác nhau mỗi lần. Chạy mã và xem liệu bạn có thể hiểu điều gì đang xảy ra hay không.
Richie Cotton

2
Đây sẽ là một ví dụ tuyệt vời để chứng minh ...length()cũng
MichaelChirico

19

Bạn nên xem phần "Định nghĩa ngôn ngữ R", phần 2.1.9 Dấu chấm-chấm-chấm . Nó đi kèm với cài đặt R. Chạy help.start()trong một phiên tương tác để đưa ra trợ giúp HTML và nhấp vào liên kết Định nghĩa ngôn ngữ R. Bạn cũng có thể sử dụng phiên bản PDF hoặc HTML từ trang web chính.

Dù sao, ...được sử dụng để so khớp các đối số chính thức không xác định của một hàm.

args(sapply)                                                                                                               
function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)                                                                    
NULL   

sapply(mtcars, mean, trim = .5)                                                                                            
    mpg     cyl    disp      hp    drat      wt    qsec      vs      am    gear                                              
 19.200   6.000 196.300 123.000   3.695   3.325  17.710   0.000   0.000   4.000                                              
   carb                                                                                                                      
  2.000 

Như bạn thấy, tôi đã vượt qua trim = .5mặc dù nó không được chỉ định như một đối số chính thức của sapplyhàm.

(lưu ý rằng ví dụ này là nhỏ, bạn có thể sử dụng sapply(mtcars, median)để đạt được kết quả tương tự)


1
Nếu nó không được chỉ định, làm thế nào bạn biết nó hợp pháp hoặc hợp lệ?
qed

@qed trimlà một đối số của meanhàm. Bên ...trong sapplylà cơ chế trimđược chuyển đến mean.
Richie Cotton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.