2015-08-16 15 views
12

Nếu chúng ta xem phần thân của hàm có dấu chấm ... trong danh sách đối số của nó, chúng ta thường có thể tìm thấy hàm nhận các đối số dấu chấm đó.Dấu chấm vắng mặt (`...`) được xử lý ở đâu?

Ví dụ: chúng ta có thể thấy trong phần sapply() rằng các đối số dấu chấm được chuyển đến lapply().

sapply 
# function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE) 
# { 
#  FUN <- match.fun(FUN) 
#  answer <- lapply(X = X, FUN = FUN, ...) 
#  ## rest of function body 
# } 
# <bytecode: 0x000000000e05f0b0> 
# environment: namespace:base> 

Tuy nhiên, trong lapply(), có những chấm ... trong danh sách đối số nhưng không trong thân hàm.

lapply 
# function (X, FUN, ...) 
# { 
#  FUN <- match.fun(FUN) 
#  if (!is.vector(X) || is.object(X)) 
#   X <- as.list(X) 
#  .Internal(lapply(X, FUN)) 
# } 
# <bytecode: 0x0000000009414f08> 
# <environment: namespace:base> 

Vì vậy, nơi nào các dấu chấm ... luận trong lapply() được xử lý? Chúng được truyền đến đâu? Chúng tôi không thể chuyển chúng đến match.fun(). Tôi đoán chúng được chuyển vào .Internal() nhưng tôi không thấy bất kỳ lý do nào để làm việc này khi tôi không thấy chúng được truyền vào bất kỳ hàm nào trong phần thân hàm.

Trả lời

13

Chúng không rõ ràng được thông qua đến .Internal, nhưng tôi tin rằng chúng có sẵn cho do_lapply (trong src/main/apply.c) thông qua phạm vi động. Các quy tắc phạm vi có thể hơi khác so với bình thường, vì .Internal là một hàm nguyên thủy.

Bạn có thể thấy rằng ... (R_DotsSymbol) được thêm vào lệnh gọi hàm lapply tạo, vì vậy chúng sẵn có cho cuộc gọi hàm trên từng phần tử danh sách. tmp tương đương với X[[i]]R_fcall tương đương với FUN(X[[i]], ...).

SEXP tmp = PROTECT(LCONS(R_Bracket2Symbol, 
     LCONS(X, LCONS(isym, R_NilValue)))); 
SEXP R_fcall = PROTECT(LCONS(FUN, 
      LCONS(tmp, LCONS(R_DotsSymbol, R_NilValue)))); 
Các vấn đề liên quan