R 中的基本数据结构是vector。事实上,人们通常所说的 scalar 在 R 中实现为包含单个元素的向量。
大多数处理数值数据的 R 函数直接使用向量,因此不需要循环。
因此,计算向量中元素总和的函数如下所示:
mySum <- function(x){
sum(x)
}
也就是说,不需要自定义函数,因为可以简单地使用 sum() 函数来计算向量的和。
input <- c(10, -2, 4, 0, 2, -4, 2)
mySum <- sum(input)
由于 R 中的向量处理是一种提高执行速度的功能,因此对于 R 初学者来说,学习如何在自己的代码中尽可能利用此功能非常重要。
问题中提出的对向量求和的解决方案如下所示:
input <- c(10, -2, 4, 0, 2, -4, 2)
sumVector <- function(x){
mySum <- 0 # initialize result value
for(i in x){
mySum <- sum(mySum,i)
}
mySum # return final value as result of function
}
在函数中,首先我们创建一个保存变量来存储中间计算,mySum。然后,我们遍历输入向量中的元素,将每个值添加到中间变量。最后,我们通过打印中间变量将结果返回给父环境。
...和输出:
> sumVector(input)
[1] 12
但是,简单的元素总和不是向量的大小...
计算原点向量的大小
向量的大小是笛卡尔坐标系(二维或三维)或更一般的 n 维欧几里得空间中点到原点的距离。
我们可以使用勾股定理C = sqrt(A^2 + B^2) 来计算二维向量的大小,如下所示。
magnitude <- function(x){
sqrt(sum(x * x))
}
input <- c(-5,3)
magnitude(input)
...和输出:
> magnitude(input)
[1] 5.830952
上面写的magnitude 函数利用了R 向量处理。计算向量x 中每个元素的平方值的代码呈现为x * x,R 将其解释为“将x 的每个元素自身相乘”。此操作返回一个与原始x 向量具有相同元素数的向量。
我们可以用原始问题中的input 向量来说明这一点。
> input * input
[1] 100 4 16 0 4 16 4
因此,该函数处理超过 2 维的向量,正如我们用 3 维向量说明的那样。
input <- c(2,3,5)
magnitude(input)
...和输出:
> magnitude(input)
[1] 6.164414
回到最初的问题,在这个特定情况下,问题中提供的向量的大小恰好等于向量中各个值的总和。
> input <- c(10, -2, 4, 0, 2, -4, 2)
> magnitude(input)
[1] 12
为什么?原来对于这个向量,元素的平方和是144,我们在7维空间中取一个平方根计算从原点到点的距离,我们得到12。
基于for() 的magnitude() 实现
我们可以按照原始问题中的要求使用for() 循环分解向量处理,如下所示。
magnitude <- function(x){
sumOfSquares <- 0
for(i in x) sumOfSquares <- sum(i^2,sumOfSquares)
sqrt(sumOfSquares)
}
我们可以通过将其与上面产生的结果进行比较来测试实现。
input <- c(10, -2, 4, 0, 2, -4, 2)
magnitude(input)
input <- c(2,3,5)
magnitude(input)
input <- c(-5,3)
magnitude(input)
...和输出:
> input <- c(10, -2, 4, 0, 2, -4, 2)
> magnitude(input)
[1] 12
> input <- c(2,3,5)
> magnitude(input)
[1] 6.164414
> input <- c(-5,3)
> magnitude(input)
[1] 5.830952