-1

次の問題について何時間も考えます。シミュレーション スタディを実行していますが、コードの最後でこれらの関数を呼び出せるようにするために、シミュレーション スタディの外部で関数を定義したいと考えています。

非常に単純化された例:

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 は 1 行目と 2 行目ではなく 3 行目のみを埋めます。

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

私の質問は、R が 1 行目と 2 行目を埋めないのはなぜですか。また、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 が必要に応じて出力を保存するようにコードを変更するにはどうすればよいですか?

よろしくお願いします。

4

2 に答える 2

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)
}
于 2013-03-28T18:43:24.087 に答える
0

これはあなたの場合にうまくいくはずです。基本的に、for ループの各反復で 1 行を返します。「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()
}
于 2013-04-02T10:06:57.073 に答える