如果我们查看...在其参数列表中有点的函数体,我们通常可以找到接收这些点参数的函数.  
例如,我们可以在主体中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>
Run Code Online (Sandbox Code Playgroud)
然而,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>
Run Code Online (Sandbox Code Playgroud)
那么get处理中的点...参数在lapply()哪里?他们传递给了什么/在哪里?我们无法将它们传递给match.fun().我认为它们被传入.Internal()但是当我没有看到它们被传递到函数体中的任何函数时,我认为没有任何理由可以工作.
Jos*_*ich 13
它们没有明确传递给我们.Internal,但我相信它们可以do_lapply通过动态范围(在src/main/apply.c中)使用.范围规则可能与通常略有不同,因为.Internal它是原始函数.
您可以看到...(R_DotsSymbol)被添加到函数调用lapplycreated中,因此它们可用于每个列表元素的函数调用.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))));
Run Code Online (Sandbox Code Playgroud)