【问题标题】:Store values in For Loop在 For 循环中存储值
【发布时间】:2013-12-07 22:00:23
【问题描述】:

我在 R 中有一个 for 循环,我想在其中存储每个计算的结果(对于循环通过的所有值)。在 for 循环中调用了一个函数,并将输出存储在当前的变量 r 中。但是,这在每个连续循环中都会被覆盖。如何通过函数存储每个循环的结果并在之后访问它?

谢谢,

例子

for (par1 in 1:n) {
var<-function(par1,par2)
c(var,par1)->var2
print(var2)

所以 print 会返回 var2 的每个实例,但在 var2 中只保存最后一个 n 的值。有没有什么方法可以获取数据数组或其他东西?

【问题讨论】:

  • 我在 .NET 中执行此操作的方法是使用数组并递增索引器...
  • R 中有没有等价物?
  • 请发布您的代码或示例。答案取决于你在做什么。

标签: r loops


【解决方案1】:

初始化一个空对象,然后通过索引赋值

a <- 0
for (i in 1:10) {
     a[i] <- mean(rnorm(50))
}

print(a)

编辑:

要包含一个具有两个输出变量的示例,在最基本的情况下,创建一个空矩阵,其列数与输出参数对应,行数与迭代次数匹配。然后通过在 for 循环中索引行位置,将输出保存在矩阵中:

n <- 10
mat <- matrix(ncol=2, nrow=n)

for (i in 1:n) {
    var1 <- function_one(i,par1)
    var2 <- function_two(i,par2)
    mat[i,] <- c(var1,var2)
}

print(mat)

迭代号i 对应于mat 对象中的行号。所以没有必要明确地跟踪它。

不过,这只是为了说明基础知识。一旦您理解了上述内容,使用@eddi 给出的优雅解决方案会更有效,尤其是在您处理许多输出变量时。

【讨论】:

  • 问题是我的函数有几个参数,我还必须跟踪确切的 i..所以它应该读取为输出 i value i value...。
  • 确切的 i 对应于存储函数值的 a 的索引。因此,循环中第 i 次迭代的第 i 个值是 a[i]
  • @TimHeinert 这是正确答案。在 R 中尝试一下,你会看到。
  • 你不应该在循环中增长一个对象,因为这会使你的代码变慢。您应该将其预先分配到正确的大小(就像您在第二个示例中所做的那样):a &lt;- numeric(10)
  • 但我有两个参数的函数,而不是两个函数,每个函数都有 1 个参数,所以我如何将它应用于我提出的问题?
【解决方案2】:

要获得结果列表:

n = 3
lapply(1:n, function(par1) {
  # your function and whatnot, e.g.
  par1*par1
})

或者sapply,如果你想要一个向量来代替。

再复杂一点的例子:

n = 3
some_fn = function(x, y) { x + y }

par2 = 4
lapply(1:n, function(par1) {
  var = some_fn(par1, par2)
  return(c(var, par1))  # don't have to type return, but I chose to make it explicit here
})
#[[1]]
#[1] 5 1
#
#[[2]]
#[1] 6 2
#
#[[3]]
#[1] 7 3

【讨论】:

  • for 循环在响应中去了哪里?为什么 par1*par1 或者这只是一个例子?
  • @TimHeinert read ?lapply - apply 系列函数大致相当于 for 循环;是的,这只是一个例子
猜你喜欢
  • 2015-08-25
  • 1970-01-01
  • 2016-08-21
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多