使用“…”R拆分函数的数组参数

以下函数创建一个data.frame,其中n列为参数个数

functionWithDots <- function(...) {
  f1 <- function(x) c(x,x+4)
  list <- list(...)
  list <- lapply(list, f1)
  expand.grid(list)
  }

当它运行时
functionWithDots(1,2)
预期的结果是:

> id Var1 Var2

> 1 2
> 5 2
> 1 6
> 5 6

如果我通过将“(1,2)”替换为“1:2”来做同样的事情

functionWithDots(1,2)

结果是

> id Var1

> 1
> 2
> 5
> 6

如何将正确的非连接参数传递给该函数,因为它在传递时似乎返回不同的结果,比方说,“1,2,3”而不是“c(1,2,3)”?

最佳答案 假设我正确理解了问题,即. OP希望通过在functionWithDots中传递1,2和1:2来获得相同的结果,这是解决它的一种方法.我们将两个元素中的元素转换为列表,并且它们应该为两种情况提供相同的结果.

functionWithDots <- function(...) {
   f1 <- function(x) c(x,x+4)
   dots <- c(...)
   list <- as.list(dots)
   list <- lapply(list, f1)
   expand.grid(list)
 }


functionWithDots(1,2)
#  Var1 Var2
#1    1    2
#2    5    2
#3    1    6
#4    5    6
 functionWithDots(1:2)
#  Var1 Var2
#1    1    2
#2    5    2
#3    1    6
#4    5    6

检查1:3 vs 1,2,3

functionWithDots(1,2,3)
#  Var1 Var2 Var3
#1    1    2    3
#2    5    2    3
#3    1    6    3
#4    5    6    3
#5    1    2    7
#6    5    2    7
#7    1    6    7
#8    5    6    7

functionWithDots(1:3)
#  Var1 Var2 Var3
#1    1    2    3
#2    5    2    3
#3    1    6    3
#4    5    6    3
#5    1    2    7
#6    5    2    7
#7    1    6    7
#8    5    6    7

现在,让我们看看OP函数中的问题(删除了lapply和expand.grid)

functionWithDots <- function(...) {
  f1 <- function(x) c(x,x+4)
  list <- list(...)
  print(list)
}

在第一种情况1:2中,函数返回长度为1的列表

functionWithDots(1:2)
#[[1]]
#[1] 1 2

而在第二个中,它返回一个长度等于输入中元素数量的列表

functionWithDots(1,2)
#[[1]]
#[1] 1

#[[2]]
#[1] 2

在修改后的函数中,两者都返回列表,其长度等于输入参数中的元素数.

functionWithDots <- function(...) {
  f1 <- function(x) c(x,x+4)
  dots <- c(...)
  list <- as.list(dots)
  print(list) 
 }

functionWithDots(1:2)
#[[1]]
#[1] 1

#[[2]]
#[1] 2

functionWithDots(1,2)
#[[1]]
#[1] 1

#[[2]]
#[1] 2
点赞