私はJavaとPythonの背景を持っており、私は最近Rを学んでいます。Rは関数呼び出しでオブジェクトをどのように扱うのですか?
今日、私はRがJavaやPythonとはかなり異なったオブジェクトを扱っているようです。例えば
、以下のコード:
x <- c(1:10)
print(x)
sapply(1:10,function(i){
x[i] = 4
})
print(x)
コードは、以下の結果が得られる:
[1] 1 2 3 4 5 6 7 8 9 10
[1] 1 2 3 4 5 6 7 8 9 10
をしかし、私は変性するので、出力の2行目は、すべての「4」であることを期待しますサプリー関数のベクトル。
これは、Rはオブジェクトの参照ではなく関数呼び出しでオブジェクトのコピーを作成するということですか?
ありがとう!しかし、なぜそのようなコードをRに書くのではないでしょうか?潜在的なリスクはあるのですか?私は他の言語の関数でグローバルオブジェクトを変更するのはかなり普通だと思います。 –
関数型言語では、関数は副作用を持つことができません。 Rはそれほど厳密ではありませんが、R関数が副作用を制限するということはまだ真実です。あたかも別の言語で書いているかのように書くのではなく、むしろ使いたいと思った方法で作業する方が良いです。オブジェクトシステムはいくつかあります(S3、S4、参照クラス)。 S3が最も一般的に使用されています。 S4ははるかに複雑です。参照クラスは最近追加されたクラスです。特に、参照クラスを探索することができます。また、protoとR.oo(そしておそらく他のもの)という異なるパラダイムを提供するユーザー貢献パッケージもあります。 –
@Spirit Plus '.GlobalEnv'の代わりに' parent.frame(3) 'を使って、サプリーが実行されたクロージャーにxを格納することができます。何がもっと安全でしょうか。 (なぜ3〜1匿名機能フレーム、2サプリーフレーム、3サプリーエンクロージャ) – mbq