使用" ..."分割函数的数组参数[R

时间:2015-08-14 10:03:47

标签: r function arguments

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

elixir(function(mix) {
  mix
    .sass('app.scss', './public/css/app.css')
    .sass('admin.scss', './public/css/admin.css');
});

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

  • id Var1 Var2
    1. 1 2
    2. 5 2
    3. 1 6
    4. 5 6

如果我通过替换"(1,2)"来做同样的事情。用" 1:2"如

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

结果是

  • id Var1
    1. 1
    2. 2
    3. 5
    4. 6

如何将正确的非关联参数传递给该函数,因为它在传递时似乎返回不同的结果,让我们说,&#34; 1,2,3&#34;而不是&#34; c(1,2,3)&#34;?

1 个答案:

答案 0 :(得分:2)

假设我正确理解了问题,即。 OP希望通过在1,2中传递1:2functionWithDots来获得相同的结果,这是修复它的一种方法。对于这两种情况,我们将...中的元素转换为list,并且应该为这两种情况提供相同的结果。

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:31,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功能中的问题(删除了lapplyexpand.grid

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

在第一种情况1:2中,该函数返回list length 1

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

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

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

#[[2]]
#[1] 2

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

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