8

私は R (およびプログラミング全般) が初めてで、次のコードのビットが異なる結果をもたらす理由について混乱しています。

x <- 100

for(i in 1:5){
  x <- x + 1
  print(x)
}

これにより、予想どおり、シーケンス 101:105 が段階的に出力されます。

x <- 100

f <- function(){
  x <- x + 1
  print(x)
}

for(i in 1:5){
  f()
}

しかし、これは 101 を 5 回出力するだけです。

ロジックを関数にパッケージ化すると、インクリメントではなく、反復ごとに元の値に戻るのはなぜですか? そして、これを繰り返し呼び出される関数として機能させるにはどうすればよいでしょうか?

4

2 に答える 2

15

問題

これは、関数内でx左側でローカル変数を処理しx、右側でグローバル変数を処理しているためです。関数でグローバルを更新するのではなく、値をローカルにx割り当てます。関数を呼び出すたびに同じことが起こるので、localを5 回割り当てて、5 回出力します。101xx101

視覚化するには:

# this is the "global" scope
x <- 100

f <- function(){
  # Get the "global" x which has value 100,
  # add 1 to it, and store it in a new variable x.
  x <- x + 1
  # The new x has a value of 101
  print(x)
}

これは、次のコードのようになります。

y <- 100

f <- function(){
  x <- y + 1
  print(x)
}

考えられる修正の 1 つ

それを修正するために何をすべきかについて。変数を引数として取り、それを update として返します。このようなもの:

f <- function(old.x) {
    new.x <- old.x + 1
    print(new.x)
    return(new.x)
}

戻り値を保存したいので、更新されたコードは次のようになります。

x <- 100

f <- function(old.x) {
    new.x <- old.x + 1
    print(new.x)
    return(new.x)
}

for (i in 1:5) {
  x <- f(x)
}
于 2013-05-18T14:33:56.803 に答える