title: Where do absent dots (`...`) get processed?
body: <p>If we view the body of a function that has dots <code>...</code> in its argument list, we can usually find the function that receives those dots arguments.  </p>
  
  <p>For example, we can see in the body of <code>sapply()</code> that the dots arguments are passed through to <code>lapply()</code>.</p>
  
  <pre><code>sapply
  # function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE) 
  # {
  #     FUN &lt;- match.fun(FUN)
  #     answer &lt;- lapply(X = X, FUN = FUN, ...)
  #     ## rest of function body
  # }
  # &lt;bytecode: 0x000000000e05f0b0&gt;
  # environment: namespace:base&gt;
  </code></pre>
  
  <p>However, in <code>lapply()</code>, there are dots <code>...</code> in the argument list but <strong>not</strong> in the function body.</p>
  
  <pre><code>lapply
  # function (X, FUN, ...) 
  # {
  #     FUN &lt;- match.fun(FUN)
  #     if (!is.vector(X) || is.object(X)) 
  #         X &lt;- as.list(X)
  #     .Internal(lapply(X, FUN))
  # }
  # &lt;bytecode: 0x0000000009414f08&gt;
  # &lt;environment: namespace:base&gt;
  </code></pre>
  
  <p>So where do the dots <code>...</code> arguments in <code>lapply()</code> get processed?  What/where are they passed to? We cannot pass them to <code>match.fun()</code>.  I presume they are passed into <code>.Internal()</code> but I don't see any reason for this to work when I don't see them passed into any function in the function body.</p>