例如,如果我有一个多维列表对象,比如“x”
x <- list(); x[[1]] <- c(1,2,3); x[[2]] <- c(2,3,4);
x[[3]] <- c(3,4,5); x[[4]] <- c(4,5,6)
a <- combn(x,3)
如果我想将第一列中的每一行合并为一个向量,这不会给我我想要的东西:
c(a[1:3,1]).
它返回一个列表,每个元素都是原始列表的一个元素。相反,这有效:
do.call(c,a[1:3,1])
根据帮助说明,所有do.call都执行一个函数,为什么结果不同?
答案 0 :(得分:3)
c(a[1:3,1])
在此等同于a[1:3,1]
,此处与a[1:3]
相当。所有这一切都是组合列表,而不是组合此列表的元素。
do.call
对参数列表执行函数调用,在这种情况下,它执行c
函数来组合a
的元素。
你想要的是c(a[1:3], recursive = TRUE)
,它通过列表递归地将元素组合成一个向量。
答案 1 :(得分:3)
do.call
的第二个参数是传递给函数的参数列表。因此do.call(c, a[1:3,1])
相当于c(a[[1]], a[[2]], a[[3]])
。
如果您想在使用c
时将列表传递给do.call
,则需要将列表放在列表中:do.call(c, list(a[1:3,1]))
。