【问题标题】:How would I write a function that takes a vector as input and evaluates its magnitude using a for loop in R?我将如何编写一个将向量作为输入并使用 R 中的 for 循环评估其大小的函数?
【发布时间】:2021-01-24 09:58:04
【问题描述】:

我正在尝试编写一个函数,该函数将采用向量 c(10, -2, 4, 0, 2, -4, 2) 并评估其大小并返回 12...我对 R 很陌生,谢谢。

input = c(10, -2, 4, 0, 2, -4, 2)
evaluate <- function(input){
  for(i in input){
    sum = sum(input)
  } 
  print(sum)
}

【问题讨论】:

  • 你只需要 sum(c(10, -2, 4, 0, 2, -4, 2)) ?
  • 量级是什么意思?
  • @Waldi - 问题中包含的向量是一种特殊情况,其大小(到 n 维欧几里得空间/笛卡尔坐标系中的原点的距离)等于向量,正如我在回答中所描述的那样。

标签: r loops for-loop vector


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-12-09
    • 1970-01-01
    • 2018-10-05
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    相关资源
    最近更新 更多