【发布时间】:2021-07-12 16:06:54
【问题描述】:
我是 R` 的新手,我发现了这个问题:
使用 R 计算以下总和: 1+(2/3)+(2/3)(4/5)+...+(2/3)(4/5)...(38/39)
我很想知道如何在不使用 for 循环 并且只使用 vector 操作的情况下解决这个问题。
我的想法和我到目前为止所尝试的:
假设我创建了两个向量,例如
x<-2*(1:19)
y<-2*(1:19)+1
然后,x 包含问题中的所有分子,y 包含所有分母。现在
z<-x/y
将创建一个长度为19 的向量,其中将存储2/3、4/5、...、38/39 的值
我正在考虑使用 R 中的 prod 函数来查找所需的产品。所以,我创建了一个这样的向量
i<-1:19
为了从第一个元素到最后一个元素遍历z,我确实写了:
prod(z[1:i])
但它惨败,给了我结果:
[1] 0.6666667
Warning message:
In 1:i : numerical expression has 19 elements: only the first used
我想做的事:
我希望将(2/3), (2/3)(4/5), ..., (2/3)(4/5)...(38/39) 的值单独存储在另一个向量中(例如p),因此其中将包含19 元素。然后我打算使用sum 函数来最终找出所有这些的总和......
我卡在哪里了:
如R documentation 中所述,prod 函数返回其参数中存在的所有值的乘积。所以,
prod(z[1:1])
prod(z[1:2])
prod(z[1:3])
将分别返回 (2/3), (2/3)(4/5), (2/3)(4/5)(6/7) 的值:
> prod(z[1:1])
[1] 0.6666667
> prod(z[1:2])
[1] 0.5333333
> prod(z[1:3])
[1] 0.4571429
但不可能像这样继续对向量z 的所有19 元素执行此操作。我被困在这里思考可以做什么。我想逐个迭代z 的所有元素,我为此创建了另一个向量i,如上所述,但它并没有像我想象的那样进行。对于如何做到这一点,任何帮助、建议和提示都会非常有用。我的想法似乎已经用完了。
更多信息:
在这里,我以系统的方式提供所有输出,以便其他人更好地理解我的问题:
> x
[1] 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38
> y
[1] 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
> z
[1] 0.6666667 0.8000000 0.8571429 0.8888889 0.9090909 0.9230769 0.9333333
[8] 0.9411765 0.9473684 0.9523810 0.9565217 0.9600000 0.9629630 0.9655172
[15] 0.9677419 0.9696970 0.9714286 0.9729730 0.9743590
> i
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
简短说明(前面有争议的声明):这篇文章确实受益于 LaTeX 的使用,但不幸的是,由于极其严重的依赖关系,就像现在一样在几篇关于在 Stack Overflow 中包含 LaTeX 的帖子中提到(如 this),直到现在还没有发生。
【问题讨论】: