以下函数创建一个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