我花了好几个小时思考以下问题。我正在进行模拟研究,我想在模拟研究之外定义函数,以便能够在代码的末尾调用这些函数。
一个非常简单的例子:
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”)。但是,如果我使用下面的代码,则只填充第三行而不是第一行和第二行。
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按照我想要的方式存储输出?
提前感谢您的帮助!
答案 0 :(得分: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)
}
答案 1 :(得分:0)
这适用于您的情况。基本上,在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()
}