web-dev-qa-db-ja.com

Rでの定数変数の宣言

私はRで作業していますが、私(または共同作業者の1人)が変更できないいくつかの変数を定義したいと思います。 C++ではこれを行います:

const std::string path( "/projects/current" );

Rプログラミング言語でこれを行うにはどうすればよいですか?

わかりやすくするために編集:Rで次のような文字列を定義できることを知っています:

path = "/projects/current"

私が本当に必要としているのは、「path」という名前の変数に関連付けられた値を誰も変更できないことを保証する言語構造です。

コメントに返信するために編集します。

Constがコンパイル時の保証であることは技術的には真実ですが、Rインタープリターがエラーメッセージとともに実行停止をスローすることは私の心の中で有効です。たとえば、数値定数に値を割り当てようとするとどうなるかを見てみましょう。

> 7 = 3
Error in 7 = 3 : invalid (do_set) left-hand side to assignment

だから私が本当に欲しいのは、値を一度だけ割り当てることができる言語機能であり、constとして宣言された変数に新しい値を割り当てようとすると何らかのエラーが発生するはずです。エラーが実行時に発生するかどうか、特にコンパイルフェーズがない場合は気にしません。これは、ウィキペディアの定義では技術的には一定ではないかもしれませんが、非常に近いものです。また、これはRプログラミング言語では不可能のようです。

38
James Thompson

lockBindingを参照してください:

a <- 1
lockBinding("a", globalenv())
a <- 2
Error: cannot change value of locked binding for 'a'
47
hadley

コードを他の人に配布することを計画しているので、パッケージの作成を検討することができます(すべきですか?)。そのパッケージ内にNAMESPACEを作成します。そこで、定数値を持つ変数を定義できます。少なくとも、パッケージが使用する関数については。ご覧ください Tierney(2003)Rの名前空間管理

10
Thierry

Rではこれが不可能だと確信しています。誤って値を書き直すことを心配している場合は、すべての定数をリスト構造に入れるのが最も簡単な方法です。それらの値を再使用します。何かのようなもの:

my.consts<-list(pi=3.14159,e=2.718,c=3e8)

次に、それらにアクセスする必要がある場合、何をすべきでないかを知るための補佐官のメモがあり、通常の名前空間からそれらを押し出します。

もう1つの質問は、R開発メーリングリストです。お役に立てれば。

(新しいアイデアのために編集:) bindenv 関数は

環境と環境内のバインディングを調整するための実験的なインターフェース。これらは、環境と個々のバインディングをロックし、変数を関数にリンクすることを可能にします。

これは、誤った安心感を与える可能性のある種類のもののように見えますが(const以外の変数へのconstポインターなど)、役立つ場合があります。

(フォーカス用に編集:) constコンパイル時の保証 であり、メモリ内のビットのロックダウンではありません。 Rには、すべてのコードを一度に確認するコンパイルフェーズがないため(インタラクティブに使用するために構築されています)、将来の命令が保証に違反しないことを確認する方法はありません。これを行う正しい方法があれば、 R-help リストの人々は知っているでしょう。私が提案する回避策:独自のコンパイルを偽造します。 「定数」変数の出現ごとに対応するリテラルを手動で置き換えるRコードを前処理するスクリプトを記述します。

(オリジナル:) C "const"のように機能する変数を持つことで、どのようなメリットが得られることを望んでいますか?

Rには排他的に 値による呼び出しのセマンティクス があるため(環境をいじくり回さない限り)、変数の関数を呼び出して変数を壊すことを心配する理由はありません。ある種の命名規則を採用するか、OOP構造を使用することは、あなたとあなたの共同作業者が誤って同じ名前の変数を使用することを心配している場合、おそらく正しい解決策です。

あなたが探している機能は存在するかもしれませんが、あなたがあなたの行動を元に戻すことができるようにしたいインタラクティブな環境としてのOriginofRを考えるとそれは疑わしいです。

3
othercriteria

Rには言語定数機能がありません。上記のリストのアイデアは良いです。私は個人的にALL_CAPSのような命名規則を使用しています。

1
Brendan OConnor