v < - 2 * x + y + 1需要说明

时间:2016-08-02 14:45:14

标签: r

我正在使用https://cran.r-project.org/doc/manuals/r-release/R-intro.pdf学习R编程语言。下面的代码(第7页,页面底部)表示2 * x将执行2.2次,但我能理解的是2 * x表示2乘以X向量的每个元素。

但是手册说了2.2次;来自这里的0.2倍在哪里?或许我正在以错误的方式看待它。

x <- c(10.4, 5.6, 3.1, 6.4, 21.7)
y <- c(x, 0, x)
v <- 2*x + y + 1
  

生成一个长度为11的新向量v,通过逐个元素加在一起构建,2 * x重复2.2次,y重复一次,1次重复11次。

请帮助理解这个表达。

5 个答案:

答案 0 :(得分:3)

2.2是x将被重复的次数(不是x将乘以的x)。在你的例子中,x长度为5,y长度为11. 2.2因为2.2倍5是11,所以为了将2个相同长度的向量加在一起,较短的一个(2 * x的结果)长度为5必须重复(2.)然后从该向量中取出一个元素,使总长度为11。

如果您设置y <- rep(0,11)以使y仍为11长,但现在为0,则可能会更清楚一些,因此当您执行添加时,您可以确切地看到2*x会发生什么(因为添加0的向量将执行复制,但不会更改值。)

如果没有明确区分乘法(2*)和复制(2.2次),那么你所引用的措词就有点尴尬了。

答案 1 :(得分:2)

在R中,算术运算符是矢量化的。如果x是向量,则向量的每个元素将乘以2。

1:10
# [1]  1  2  3  4  5  6  7  8  9 10
2 * 1:10
# [1]  2  4  6  8 10 12 14 16 18 20
2 * 1:10 + 1
# [1]  3  5  7  9 11 13 15 17 19 21

要了解详情,请在R控制台中输入?"*"

在您的示例中,如果xy长度不同,您可能会发现意外行为。

例如:

1:10 + 1:2
# [1]  2  4  4  6  6  8  8 10 10 12
1:10 + 1:3
# [1]  2  4  6  5  7  9  8 10 12 11
Warning message:
In 1:10 + 1:3 :
  longer object length is not a multiple of shorter object length

答案 2 :(得分:2)

来自PDF:

x <- c(10.4, 5.6, 3.1, 6.4, 21.7) # length 5
y <- c(x, 0, x) # length 11

2.2仅仅是因为R重复x 2.2次以使其长度为11,因此表达式2*x + y + 1隐含地执行

2 * c(10.4, 5.6, 3.1, 6.4, 21.7, 10.4, 5.6, 3.1, 6.4, 21.7, 10.4) + 
c(10.4, 5.6, 3.1, 6.4, 21.7, 0, 10.4, 5.6, 3.1, 6.4, 21.7) +
c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)

答案 3 :(得分:2)

完整的例子是:

x <- c(10.4, 5.6, 3.1, 6.4, 21.7)
y <- c(x, 0, x)
v <- 2*x + y + 1

请注意,x的长度为5,但y的长度为11,因此问题是如何将不同的长度向量加在一起,并通过将较短的向量(x)循环到与y相同的长度来解决。较短的向量是5长,所以我们必须将它再循环到长度11,其长度为11/5 = 2.2。也就是说,上面代码中的最后一个语句在概念上与以下任何一个相同:

v <- 2 * c(x, x, x[1]) + y + 1

v <- 2 * x[c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1)] + y + 1

v <- 2 * c(x[1], x[2], x[3], x[4], x[5], x[1], x[2], x[3], x[4], x[5], x[1]) + y + 1

v <- c(2*x[1] + y[1] + 1,
       2*x[2] + y[2] + 1,
       2*x[3] + y[3] + 1,
       2*x[4] + y[4] + 1,
       2*x[5] + y[5] + 1,
       2*x[1] + y[6] + 1, # there is no x[6] so x is recycled to x[1]
       2*x[2] + y[7] + 1,
       2*x[3] + y[8] + 1,
       2*x[4] + y[9] + 1,
       2*x[5] + y[10] + 1,
       2*x[1] + y[11] + 1) # x is recycled to x[1]

v <- numeric( length(y) )
for(i in seq_along(v)) v[i] <- 2 * x[ (i-1) %% length(x) + 1 ] + y[i] + 1

答案 4 :(得分:1)

在链接的第2章中有向量x,即

x <- c(10.4, 5.6, 3.1, 6.4, 21.7)
> x
[1] 10.4  5.6  3.1  6.4 21.7

和y是

y <- c(x, 0, x)
> y
 [1] 10.4  5.6  3.1  6.4 21.7  0.0 10.4  5.6  3.1  6.4 21.7

因为x有5个元素而y有11个,所以当你想做x + y时,x会重复到11个元素。 11/5 = 2.2 =通常必须重复x。 “1”只是一个元素,必须重复11次。