我有两个变量,x(取5个值)和y(取11个值)。当我想运行参数时,
> v <- 2*x +y +1
R回应:
Error at 2* x+y: Longer object length is not a multiple of shorter object length.
我试过:1 * x给了我5个x值,但y有11个值。那么R说它不能添加11到5个值? - 这提出了一个普遍的问题:回收在什么情况下有效?
答案 0 :(得分:13)
回收工作在您的示例中:
> x <- seq(5)
> y <- seq(11)
> x+y
[1] 2 4 6 8 10 7 9 11 13 15 12
Warning message:
In x + y : longer object length is not a multiple of shorter object length
> v <- 2*x +y +1
Warning message:
In 2 * x + y :
longer object length is not a multiple of shorter object length
> v
[1] 4 7 10 13 16 9 12 15 18 21 14
您报告的“错误”实际上是一个“警告”,这意味着R通知您它正在回收,但无论如何都要回收。您可能已启用options(warn=2)
,这会将警告转换为错误消息。
一般来说,避免依赖回收。如果你养成忽略警告的习惯,有一天它会咬你,你的代码会以一种非常难以诊断的方式失败。
答案 1 :(得分:1)
这种方式不起作用。你必须有相同长度的向量:
x_samelen = c(1,2,3)
y_samelen = c(10,20,30)
x_samelen*y_samelen
[1] 10 40 90
如果向量长度相同,则可以很好地定义和理解结果。你可以做“回收”,但实际上不建议这样做。
我写了一个简短的脚本,通过填充短向量来制作相同长度的两个向量。这样您就可以在没有警告的情况下执行代码:
x_orig <- c(1,2,3,4,5,6,7,8,9,10,11)
y_orig <- c(21,22,23,24,25)
if ( length(x_orig)>length(y_orig) ) {
x <- x_orig
y <- head(x = as.vector(t(rep(x=y_orig, times=ceiling(length(x_orig)/length(y_orig))))), n = length(x_orig) )
cat("padding y\r\n")
} else {
x <- head(x = as.vector(t(rep(x=x_orig, times=ceiling(length(y_orig)/length(x_orig))))), n = length(y_orig) )
y <- y_orig
cat("padding x\r\n")
}
结果是:
x_orig
[1] 1 2 3 4 5 6 7 8 9 10 11
y_orig
[1] 21 22 23 24 25
x
[1] 1 2 3 4 5 6 7 8 9 10 11
y
[1] 21 22 23 24 25 21 22 23 24 25 21
如果您反转x_orig和y_orig:
x_orig
[1] 21 22 23 24 25
y_orig
[1] 1 2 3 4 5 6 7 8 9 10 11
x
[1] 21 22 23 24 25 21 22 23 24 25 21
y
[1] 1 2 3 4 5 6 7 8 9 10 11