在 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
}
应该如何调用此函数以及如何处理它?另外,如果有更好的方法来做我想做的事情,请告诉我。
如何不指定 globalParam
和 valueslist
,而是传入 ...
组参数?
我认为 "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
中传递的内容实际上也是那个阶段的列表对象,具体取决于您的需要。
functionabc <- function(api_key, URL, columnNames, globalParam, ...) {
# code
}
我的函数目前通过 ...
接受某些值(可以有 1 个或多个)。然后它将所有这些存储在一个列表中。我现在想让 globalParam
可选,默认值为 ""
,我还想要一个名为 valueslist
的参数选项,它是一个列表列表。如果用户指定参数valueslist
的值,则用户不会通过...
这就是我希望函数的外观...
functionabc <- function(api_key, URL, columnNames, globalParam = "", valueslist = NULL, ...) {
# code
}
应该如何调用此函数以及如何处理它?另外,如果有更好的方法来做我想做的事情,请告诉我。
如何不指定 globalParam
和 valueslist
,而是传入 ...
组参数?
我认为 "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
中传递的内容实际上也是那个阶段的列表对象,具体取决于您的需要。