我正在使用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次。
请帮助理解这个表达。
答案 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控制台中输入?"*"
。
在您的示例中,如果x
和y
长度不同,您可能会发现意外行为。
例如:
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次。