при каких обстоятельствах R перерабатывает? - PullRequest
3 голосов
/ 02 июля 2011

У меня есть две переменные, 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 ]

13 голосов
/ 02 июля 2011

Рециркуляция работает в вашем примере:

> 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 голос
/ 02 июля 2011

Так не работает. Вы должны иметь векторы одинаковой длины:

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...