2014-06-23 41 views
3

我想在函数内创建交叉连接data.table。说,我们有一个向量vals <- c("yes", "no")。现在这个工程:CJ(vals, vals)。但是,根据功能输入,我可能需要创建例如改为CJ(vals, vals, vals, vals)。类似于在函数内交叉连接data.table

vals <- c("yes", "no") 
n <- 4 
CJ(rep(vals, n)) 

显然不起作用。如何以灵活的方式指定交叉连接的向量?

回答

5

你可以使用...这是用来引用从调用函数传递的参数...?

require(data.table) 
f <- function(...){ 
    CJ(...) 
} 

f(c(1:2) , c(3:4)) 
# V1 V2 
#1: 1 3 
#2: 1 4 
#3: 2 3 
#4: 2 4 

编辑:这个怎么样?

do.call(CJ, replicate(n, vals, simplify=FALSE)) 

#  V1 V2 V3 V4 
# 1: no no no no 
# 2: no no no yes 
# 3: no no yes no 
# 4: no no yes yes 
# 5: no yes no no 
# 6: no yes no yes 
# 7: no yes yes no 
# 8: no yes yes yes 
# 9: yes no no no 
# 10: yes no no yes 
# 11: yes no yes no 
# 12: yes no yes yes 
# 13: yes yes no no 
# 14: yes yes no yes 
# 15: yes yes yes no 
# 16: yes yes yes yes 
+1

但同样,在这种情况下,我需要明确写入'F(丘壑,丘壑)'与两列创建'data.table'和'F(瓦尔斯瓦尔斯瓦尔斯,瓦尔斯)'创建一个四列。但是,我只想指定重复次数(例如'n = 2'或'n = 4'),而不是多次明确写下向量名称。 – AnjaM

+0

非常感谢,编辑完全符合我的要求!我一直在玩'do.call',但我没有想过使用'replicate'。 – AnjaM

+0

@AnjaM我认为** @ Arun **已经很好地回答了你的问题。可以说,他应该把这个作为自己的答案,并且赢得了自己同行的赞誉,赞美和钦佩,但我并没有抱怨。 –