Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:当省略号是最后一个参数时,为什么为省略号(…)提供一个列表不起作用?_R_List_Function_Ellipsis - Fatal编程技术网

R:当省略号是最后一个参数时,为什么为省略号(…)提供一个列表不起作用?

R:当省略号是最后一个参数时,为什么为省略号(…)提供一个列表不起作用?,r,list,function,ellipsis,R,List,Function,Ellipsis,我正在编写一个利用省略号的函数(aka…)。它允许您指定可变数量的附加参数。我想提供一个包含参数的列表作为附加参数。下面是一个可复制的示例: f <- function(..., a =1, b = 2){ l <- list(...) print(l) } f(list(a = 2)) [[1]] [[1]]$a [1] 2 出于好奇,我添加了打印两个函数的默认参数: f <- function(..., a =1, b = 2){ l <- list(

我正在编写一个利用省略号的函数(aka
)。它允许您指定可变数量的附加参数。我想提供一个包含参数的列表作为附加参数。下面是一个可复制的示例:

f <- function(..., a =1, b = 2){
  l <- list(...)
  print(l)
}
f(list(a = 2))

[[1]]
[[1]]$a
[1] 2
出于好奇,我添加了打印两个函数的默认参数:

f <- function(..., a =1, b = 2){
  l <- list(...)
  print(l)
  print(c(a = a, b = b))
}
g <- function(a =1, b = 2, ...){
  l <- list(...)
  print(l)
  print(c(a = a, b = b))
}

f(list(a = 2)) # results of calling f
[[1]]
[[1]]$a
[1] 2


a b 
1 2

g(list(a = 2)) # results of calling g
list()
$a.a
[1] 2

$b
[1] 2

f如果在函数调用中不使用
list
f(a=2)
g(a=2)
都将返回变量
list()
的值

由于将列表作为参数传递,因此它被视为未命名变量,并被分配给第一个形式参数,这与
f
g
不同


如果你想做
do.call(f,list(a=2))
do.call(g,list(a=2))
,事情也会不同。在这种情况下,值
2
将被分配给预期的形式参数
a

参数在R中的工作方式是,当您不命名第一个参数时,R只假设该参数进入函数的第一个参数。对于参数列表中的第二个、第三个等参数,除
..
后面的参数外,情况也是如此-因为R不知道要在
..
中容纳多少个参数,如果要更改后面任何参数的默认值,必须对其命名


因此,在您的例子中,当调用函数
f()
时,对象
列表(a=2)
进入
。但是在
g()
中,相同的对象进入a。如果将某个内容放在参数列表的末尾,而不包括a和b的参数,则将其命名为非a或b的内容,例如(c=list(a=1)).

您的问题的简短答案是否意味着仅当省略号是函数调用中的第一个参数时,才可以将列表作为附加参数传递?为否,如果在函数调用中传递值时遵循正确的命名或位置,您不会遇到参数匹配不正确的问题

更好的做法是在函数调用中命名参数(至少从第二个参数命名),以便正确的名称匹配达到预期效果

在函数调用过程中如果不提及名称,将执行参数的位置匹配。如果未能在正确的位置发送正确的值,这可能会导致意外影响

请注意打印输出中参数名称的顺序。它遵循函数中定义的参数顺序。只有在正确命名参数的情况下,才会出现正确的顺序

如果正确地遵循参数的命名,则无需担心参数的位置。你可以把任何东西传给它。它不一定是
列表

f <- function(..., a =1, b = 2){
  mc <- match.call(expand.dots = TRUE )
  print(names(mc))
}
g <- function(a =1, b = 2, ...){
  mc <- match.call(expand.dots = TRUE )
  print(names(mc))
}

f(c1 = list(z = 2, f = 5), a = 1, b = 2)  # [1] ""   "c1" "a"  "b" 
f(a = 1, c1 = list(z = 2, f = 5), b = 2)  # [1] ""   "c1" "a"  "b"
f(a = 1, c1 = list(z = 2, f = 5), b = 2, c2 = 4) # ""   "c1" "c2" "a"  "b" 
f(c1 = list(z = 2, f = 5), 1, 2, 4) # [1] ""   "c1" ""   ""   ""  


g(c1 = list(z = 2, f = 5), a = 1, b = 2)  # [1] ""   "a"  "b"  "c1"
g(a = 1, c1 = list(z = 2, f = 5), b = 2)  # [1] ""   "a"  "b"  "c1"
g(a = 1, c1 = list(z = 2, f = 5), b = 2, c2 = 4) # [1] ""   "a"  "b"  "c1" "c2"
g(c1 = list(z = 2, f = 5), 1, 2, 4) # [1] ""   "a"  "b"  "c1" ""

f我认为@kaksat不想让论点进入a,而是进入
f <- function(..., a =1, b = 2){
  mc <- match.call(expand.dots = TRUE )
  print(names(mc))
}
g <- function(a =1, b = 2, ...){
  mc <- match.call(expand.dots = TRUE )
  print(names(mc))
}

f(c1 = list(z = 2, f = 5), a = 1, b = 2)  # [1] ""   "c1" "a"  "b" 
f(a = 1, c1 = list(z = 2, f = 5), b = 2)  # [1] ""   "c1" "a"  "b"
f(a = 1, c1 = list(z = 2, f = 5), b = 2, c2 = 4) # ""   "c1" "c2" "a"  "b" 
f(c1 = list(z = 2, f = 5), 1, 2, 4) # [1] ""   "c1" ""   ""   ""  


g(c1 = list(z = 2, f = 5), a = 1, b = 2)  # [1] ""   "a"  "b"  "c1"
g(a = 1, c1 = list(z = 2, f = 5), b = 2)  # [1] ""   "a"  "b"  "c1"
g(a = 1, c1 = list(z = 2, f = 5), b = 2, c2 = 4) # [1] ""   "a"  "b"  "c1" "c2"
g(c1 = list(z = 2, f = 5), 1, 2, 4) # [1] ""   "a"  "b"  "c1" ""