我们可以得到相同的长度
mx <- max(length(v1), length(v2))
c(v2, rep(0, mx - length(v2))) + c(v1, rep(0, mx - length(v1)))
#[1] 4 6 9 28 NA 22 NA 11 13 15
第二种情况,使用min
mn <- min(length(v1), length(v2))
v2[seq_len(mn)] + v1[seq_len(mn)]
#[1] 4 6 9 28 NA 22 NA
第三种情况
c(v2, v2[seq_len(mx - length(v2))]) + c(v1, v1[seq_len(mx - length(v1))])
#[1] 4 6 9 28 NA 22 NA 14 17 20
可以转成函数
f1 <- function(vec1, vec2, method = "min") {
switch(method,
min = {
mn <- min(length(vec1), length(vec2))
vec1[seq_len(mn)] + vec2[seq_len(mn)]
},
max = {
mx <- max(length(vec1), length(vec2))
c(vec2, rep(0, mx - length(vec2))) + c(vec1, rep(0, mx - length(vec1)))},
recycle = {
mx <- max(length(vec1), length(vec2))
c(vec2, vec2[seq_len(mx - length(vec2))]) + c(vec1, vec1[seq_len(mx - length(vec1))])
})
}
f1(v1, v2)
#[1] 4 6 9 28 NA 22 NA
f1(v1, v2, "max")
#[1] 4 6 9 28 NA 22 NA 11 13 15
f1(v1, v2, "recycle")
#[1] 4 6 9 28 NA 22 NA 14 17 20