R在什么情况下回收?

时间:2011-07-02 07:16:48

标签: r

我有两个变量,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个值? - 这提出了一个普遍的问题:回收在什么情况下有效?

2 个答案:

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