函数中“…”(三点或点-点-点)的用法[重复]


Answers:



54

一个让您入门的小例子。

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"))

函数,f将第一个输入参数以外的所有参数存储在省略号变量中。为了访问其内容,最简单的方法是将其转换为列表(1)。但是,主要用途是将参数传递给子函数,而无需进行转换(2)。


为什么在#2中再次调用相同的f函数?
张佳鹏

1
@JiapengZhang这是递归函数的一个示例。f()每次都使用不同的参数反复调用。运行代码,看看您是否能理解正在发生的事情。
Richie Cotton

2
这将是一个很好的例子来证明...length(),以及
MichaelChirico

19

您应该转到“ R语言定义”的第2.1.9Dot-dot-dot。它与R安装捆绑在一起。help.start()在交互式会话中运行以启动HTML帮助,然后单击“ R语言定义”链接。您也可以从主站点使用PDFHTML版本。

无论如何,...用于匹配函数的未指定形式参数。

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 

如您所见,trim = .5尽管没有将其指定为sapply函数的形式参数,但我还是通过了。

(请注意,此示例很简单,您可以sapply(mtcars, median)用来实现相同的结果)


1
如果未指定,您怎么知道它是合法或有效的?
QED

@qedtrimmean函数的参数。该...sapply是机制trim要传递给mean
Richie Cotton
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.