0

我想要cbind不同长度的非多重向量。较短的将(部分)像香草一样被回收cbind

cbind(c(1,2,3),c(4,5))
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    4
Warning message:
In cbind(c(1, 2, 3), c(4, 5)) :
number of rows of result is not a multiple of vector length (arg 2)

结果与预期一致,但警告除外。由于我想在扩展中使用它,是否有可能抑制警告或更好:谁知道一个直接的解决方案会产生相同的结果而没有警告!——谢谢,S。

4

2 回答 2

3

这是一个选项,将关键概念包装到一个函数中,让事情正常工作。最简单的方法就是rep()在每个元素上使用...将每个输入向量重复...到一个共同的长度(即最长输入向量的长度)。

这就是我在下面length.out使用rep().

CBIND <- function(..., deparse.level = 1) {
  dots <- list(...) ## grab the objects passed in via ... this is a list
  len <- sapply(dots, length) ## find lengths of individual vectors
  ## this applies rep() over dots extending each component vector to length
  ## of longest vector in ...
  dots <- lapply(seq_along(dots),
                 function(i, x, len) rep(x[[i]], length.out = len),
                 x = dots, len = max(len))
  ## need to put everything together so arrange for a call to cbind
  ## passing the extended list of vectors and passing along
  ## the deparse.level argument of cbind
  do.call(cbind, c(dots, deparse.level = deparse.level))
}

这给出了:

R> CBIND(c(1,2,3),c(4,5))
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    4
R> CBIND(c(1,2,3),c(4,5), deparse.level = 2)
     c(1, 2, 3) c(4, 5, 4)
[1,]          1          4
[2,]          2          5
[3,]          3          4

我肯定会赞成这个,而不是简单地suppressWarnings()在电话周围发出警告。对于生产代码,您希望明确处理您希望允许的情况,并在用户做了您未考虑的事情的情况下传播警告。

于 2012-11-13T10:05:46.553 回答
2

如果你真的想要,你可以使用suppressWarnings

suppressWarnings(cbind(c(1,2,3),c(4,5)))
#      [,1] [,2]
# [1,]    1    4
# [2,]    2    5
# [3,]    3    4
于 2012-11-13T10:02:31.193 回答