2015-08-16 84 views
12

如果我們查看在參數列表中有點...的函數的主體,我們通常可以找到接收這些點參數的函數。缺失點(`...`)在哪裏得到處理?

例如,我們可以在sapply()的主體中看到點參數被傳遞到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> 

然而,在lapply(),還有點...參數列表,但函數體。

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> 

那麼,做lapply()...論點得到處理?什麼/他們在哪裏傳遞給?我們不能將它們傳遞給match.fun()。我認爲它們被傳遞到.Internal(),但是當我沒有看到它們被傳入函數體中的任何函數時,我看不出有什麼理由讓它工作。

回答

13

他們沒有明確通過.Internal,但我相信他們是通過動態範圍提供給do_lapply(在SRC /主/ apply.c)。範圍規則可能會與通常略有不同,因爲.Internal是原始函數。

您可以看到...R_DotsSymbol)被添加到函數調用lapply中創建,所以它們可用於每個列表元素上的函數調用。 tmp大致相當於X[[i]],而R_fcall大致相當於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))));