【问题标题】:Storing Answers From Functions into a Vector in R将函数的答案存储到 R 中的向量中
【发布时间】:2021-03-11 09:42:10
【问题描述】:

我被提示了一个问题,并且非常接近解决我需要的问题。问题如下-

“编写一个 while 循环,计算并存储任何非负整数 mynum 的阶乘,方法是在每次重复大括号代码时将 mynum 减 1。”

另一个因素是,如果输入 0 或 1,则输出将为 1。

我写的代码如下-

factorialcalc <- function(i){
  factorial <- 1
  if(i==0 | i==1){
    factorial <- 1
  } else{
    while(i >= 1){
      factorial <- factorial * i
      i <- i-1
    }
  }
  return (factorial)
}

有输入-

mynum <- 5
factorialcalc(mynum)

和输出-

[1] 120

您可能想知道,“您的代码运行良好,那么问题出在哪里?” 我的问题在于问题的“计算和存储”部分。

如何修改我的代码以将 factorialcalc 的答案放入向量中?

示例- 我输入

mynum <- 5
factorialcalc(mynum)

mynum <- 3
factorialcalc(mynum)

mynum <- 4
factorialcalc(mynum)

当我调用这个新向量时,我希望看到一个包含所有三个输出的向量 (就像我制作了一个向量 c(120,6,24))

我在想有一种方法可以在我的函数或 while 循环中的某处添加这个向量,但我不确定在哪里。另外,请注意答案必须包含我的代码中的循环。

【问题讨论】:

  • 如果您将参数作为向量传递,输出将自动成为向量。 mynum &lt;- c(5, 4, 3) 然后factorialcalc(mynum)

标签: r function vector while-loop factorial


【解决方案1】:

选项 1。

“矢量化”你的函数

# simply wrap the whole thing in Vectorize()
Factorialcalc = Vectorize(function(i){
  factorial <- 1
  if(i==0 | i==1){
    factorial <- 1
  } else{
    while(i >= 1){
      factorial <- factorial * i
      i <- i-1
    }
  }
  return (factorial)
})
# Now when you supply it a vector, it runs on each element
> Factorialcalc(c(5, 3, 4))
[1] 120   6  24

选项 2。

使用旨在将单个函数应用于所提供向量的多个元素的函数。 使用 purrr 包中的 map_dbl,您可以调用:

map_dbl(c(5, 3, 4), factorialcalc)

它为您的函数factorialcalc 提供vector 中的每个元素,并在返回向量之前连接每个结果。

使用base R,您可以简单地使用apply-family 函数:

sapply(c(5, 3, 4), factorialcalc)

并得到相同的结果。

示例

> map_dbl(c(5, 3, 4), factorialcalc)
[1] 120   6  24
> sapply(c(5, 3, 4), factorialcalc)
[1] 120   6  24

【讨论】:

  • 这个答案有帮助,足以回答这个问题。如果我可以更进一步,有没有一种方法可以创建一个空向量,比如answers &lt;- c(),然后使用factorialcalc 的返回输出来填充answers 向量?
  • 如果你想这样编程,那么你不需要向量化函数。您将循环遍历您的数字,将它们一一提供给factorialcalc,并将它们一一放入您的输出向量answers。尝试使用append。类似answers &lt;- c(); for (i in c(5, 3, 4)) {answers &lt;- append(answers, factorialcalc(i))}
猜你喜欢
  • 2013-04-14
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 2014-08-16
  • 1970-01-01
相关资源
最近更新 更多