在R中,为什么使用do.call会改变结果?

时间:2016-08-10 01:49:33

标签: r

例如,如果我有一个多维列表对象,比如“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都执行一个函数,为什么结果不同?

2 个答案:

答案 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]))