2013-11-07 2 views
0

Я новичок в R. У меня есть вопрос по следующему коду.R, почему результаты этих заданий разные

f <- function(x,y){ 
    x+y[1]+y[2] 
} 

y <- matrix(1:8, ncol=2);y 
x <- 1:4 
i <- 1:4 
v1 <- f(x[i], y[i,]) 
v2 <- NULL; v2[i] <- f(x[i], y[i,]) 
v3 <- NULL; for(i in 1:4){v3[i] <- f(x[i], y[i,])} 
v1; v2; v3 

Результаты те же, что и для v1 и v2. И v3 - это то, что я хочу. Но почему я не могу просто использовать команды для v1 или v2? Почему они разные? Есть ли способ немного изменить v1 или v2, чтобы получить желаемые результаты? Заранее большое спасибо!

ответ

1

Проблема здесь состоит в том, что ваша функция f не векторизации во втором аргументе. Вы можете видеть, что происходит, если вы явно оценить слагаемые внутри функцию:

> x[i] 
[1] 1 2 3 4 
> y[i,][1] 
[1] 1 
> y[i,][2] 
[1] 2 

Таким образом, вы можете видеть, f(x[i],y[i,]) такие же, как оценку 1:4 + 1 + 2:

> 1:4 + 1 + 2 
[1] 4 5 6 7 
> f(x[i],y[i,]) 
[1] 4 5 6 7 

Если вы ожидаете матриц в второй аргумент, вы можете написать векторизованную версию функции, как описано @James. Другим вариантом является приведение y как кадр данных:

> f(x,data.frame(y)) 
    X1 
1 7 
2 10 
3 13 
4 16 

Причина это работает в том, что кадр данных представляется в виде списка столбцов, в то время как матрица представляется в виде массива с атрибутом измерения. Так y[1] даст вам первый элемент y тогда data.frame(y)[1] даст вам первый столбец:

> y[1] 
[1] 1 
> data.frame(y)[1] 
    X1 
1 1 
2 2 
3 3 
4 4 
1

Проблема возникает из-за вашей реализации f. Способ работы подмножества матриц означает, что вы возвращаете одну и ту же матрицу и всегда выбираете первые два элемента для каждого значения в x.

Если вы пишете в более vectorised образом она будет работать, как вы намерены:

f2 <- function(x,y) x+y[,1]+y[,2] 
f2(x,y) 
[1] 7 10 13 16