在 R 中编写和调用具有可选参数和可变参数的函数

Write and call function in R that with both optional and variable parameters

functionabc <- function(api_key, URL, columnNames, globalParam, ...) {
  # code
}

我的函数目前通过 ... 接受某些值(可以有 1 个或多个)。然后它将所有这些存储在一个列表中。我现在想让 globalParam 可选,默认值为 "",我还想要一个名为 valueslist 的参数选项,它是一个列表列表。如果用户指定参数valueslist的值,则用户不会通过...

输入多个值

这就是我希望函数的外观...

functionabc <- function(api_key, URL, columnNames, globalParam = "", valueslist = NULL, ...) {
  # code
}

应该如何调用此函数以及如何处理它?另外,如果有更好的方法来做我想做的事情,请告诉我。

如何不指定 globalParamvalueslist,而是传入 ... 组参数?

我认为 "optional" 参数(具有全局默认值的参数)不应影响您处理 ... 参数集中传递的内容的方式。也就是说,您必须非常小心 R 的惰性求值和 partial argument matching。如果你需要组合这些 and/or 忽略 ...valueslist= 被定义时你可以做下面的事情,注意 valueslist=NULL 出现在 ... 之后,否则你最终出现第 5 个出现的任何未命名参数将被分配给 valueslist:

的情况
functionabc <- function(api_key, URL, columnNames, globalParam="", ..., valueslist=NULL) {
  namedlist <- list(
    "api_key"=api_key, 
    "URL"=URL, 
    "columnNames"=columnNames, 
    "globalParam"=globalParam
  )

  if (is.null(valueslist)) {
    valueslist <- list(...)
  }

  print(ls())
  flush.console()
  list("namedlist"=namedlist, "valueslist"=valueslist)

  ### code
}

像这样调用函数应该都会产生合乎逻辑的结果,但同样要注意可选的命名参数中的部分匹配,您希望这些参数最终出现在 ...:

functionabc(1,2,3,4,x=5,y=6,z=7)
functionabc(1,2,3,4,5,6,7,8,9)
functionabc(1,2,3,4,5,6,7, valueslist=list(99,100,101))

例如,最后一个产生以下结果:

> functionabc(1,2,3,4,5,6,7, valueslist=list(99,100,101))
[1] "api_key"     "columnNames" "globalParam" "namedlist"  
[5] "URL"         "valueslist" 
$namedlist
$namedlist$api_key
[1] 1

$namedlist$URL
[1] 2

$namedlist$columnNames
[1] 3

$namedlist$globalParam
[1] 4


$valueslist
$valueslist[[1]]
[1] 99

$valueslist[[2]]
[1] 100

$valueslist[[3]]
[1] 101

您还可以检查以确保在 valueslist 中传递的内容实际上也是那个阶段的列表对象,具体取决于您的需要。