【问题标题】:Edit: R simulation study calling function编辑:R模拟学习调用函数
【发布时间】:2013-03-28 18:31:54
【问题描述】:

我花了几个小时思考以下问题。我正在运行一项模拟研究,我想在模拟研究之外定义函数,以便能够在我的代码末尾调用这些函数。

一个非常简单的例子:

Mat 仅表示一个带有数字的矩阵,而 res 是一个我要填充的空矩阵。

mat <- matrix(data = c(1,2,3,4,5,6), ncol = 2, nrow = 3)
res <- matrix(NA, ncol = 2, nrow = 3)

我使用函数“fun”来填充空矩阵res。

fun <- function() {
  for (i in 1:2) {
    res[y,i] <- mat[y,i]
  }
  return(res)
}

这就是我想放在代码末尾的内容(我只想调用该函数,并使用该函数填充矩阵“res”)。但是,如果我使用下面的代码,R 只会填充第三行,而不是第一行和第二行。

for (y in 1:3) {
  test <- fun()
}

我的问题是:为什么 R 不填充第一行和第二行,我如何更改我的代码以使 R 为我提供所需的结果?

提前谢谢你!

编辑:

下面的例子也说明了我的问题。我使用“metafor”包进行荟萃分析。

我想使用我在最终模拟代码之外定义的以下函数:

mat <- matrix(NA, nrow = 8, ncol = 3, dimnames = list(c("0_le", "0_ri", ".13_le", ".13_ri", ".33_le", ".33_ri", ".5_le", ".5_ri"), c("1", "2", "3")))

funtr.stu <- function(i) {
  for (y in 1:8) {
    mat[y,i] <- tr[[y]]$k0
  }
  return(mat)
}

“tr”是一个列表,由8次分析的结果组成。我想从该列表中检索对象“k0”并将其存储到矩阵“mat”中。

在代码的以下部分(我在其中运行模拟),我想调用函数并用正确的数字填充矩阵“mat”。

for (i in 1:iterations) { 
   kip <- funtr.stu()
}

此代码的结果是一个填充矩阵,但每列中的数字相同。因此,R 不是每次迭代都存储数字,而是只存储最后一次迭代。

如何修改我的代码,使 R 可以根据需要存储输出?

提前感谢您的帮助!

【问题讨论】:

  • 这里的问题是什么?您想知道如何用数据填充矩阵吗?因为如果仅此而已,那么 res&lt;-matrix(data=mat,ncol=2,byrow=TRUE) 或 "byrow=FALSE" 将以一种或另一种顺序将 mat 中的值写入 res。然后是 mat2&lt;-t(mat1) 和许多其他方法来重新排序或重塑矩阵。
  • 亲爱的 Carl, 我的问题是如何获得完整的矩阵“res”(所以不仅是第三行)。当然,我知道如果我只想填充一个矩阵,这不是一个合适的解决方案。但是,我创建了这样一个简化的情况来说明手头的问题。
  • 你的例子太简单了。很难理解你在做什么。考虑再举一个例子。

标签: r function for-loop


【解决方案1】:

这是因为您在每次迭代中都覆盖了矩阵 test 的所有值。我在循环中添加了print(test)。查看代码。

mat <- matrix(data = c(1,2,3,4,5,6), ncol = 2, nrow = 3)
res <- matrix(NA, ncol = 2, nrow = 3)

mat
res

fun <- function() {
  for (i in 1:2) {
    res[y,i] <- mat[y,i]
  }
  return(res)
}

for (y in 1:3) {
  test <- fun()
  print(test)
}

【讨论】:

  • 感谢您的帮助,现在我知道到底发生了什么。我如何对其进行编程,以便在单个矩阵中获得结果?因此,不是使用 print(test) 命令创建的三个矩阵。
  • (+1) “授人以鱼,养其一日。授人以渔,养其一生。”
【解决方案2】:

这应该适用于您的情况。基本上,在 for 循环的每次迭代中返回一行。当您返回整个“res”矩阵时。

mat <- matrix(data = c(1,2,3,4,5,6), ncol = 2, nrow = 3)
res <- matrix(NA, ncol = 2, nrow = 3)

fun <- function() {
  for (i in 1:2) {
    res[y,i] <- mat[y,i]
  }
  return(res[y,])
}

for (y in 1:3) {
  test[y,] <- fun()
}

【讨论】: