2009-06-01 7 views
28

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

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

これはRプログラミング言語でどうやって行いますか?

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

path = "/projects/current" 

私が本当に欲しいもの」誰も名前の変数に関連付けられている値を変更することはできませんことを保証言語構造でありますパス。"

編集コメントへの対応:

それはconstのはコンパイル時の保証であるが、それはRインタプリタがエラーメッセージで停止実行を投げるだろうと、私の心の中で有効になることを技術的には事実です。たとえば、あなたが数値定数に値を代入しようとすると何が起こるか見て:

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

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

答えて

34

を見てはlockBindingを参照してください:

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

あなたはまだrm(a); a <-2 though :)することができます – Spacedman

-1

IはRの表現の最も単純な並べ替えだけで一定の値、一般的に数値(数)、または文字値(テキストの一部)であるthis website

から下に答えを取りました。たとえば、10分に対応する秒数を指定する必要がある場合は、番号を指定します。

> 600 
[1] 600 

データを読み込むファイルの名前を指定する必要がある場合は、その名前を文字値として指定します。文字値は、二重引用符または一重引用符で囲む必要があります。

> "http://www.census.gov/ipc/www/popclockworld.html" 
[1] "http://www.census.gov/ipc/www/popclockworld.html" 
+1

あなたが一度割り当てを変更することはできません変数と定数を混乱しています。 –

+0

@David Locke - 良い点。私はこの問題を明確にしようとした。 –

3

(新しいアイデアのために編集:) bindenv機能は、環境内の環境とのバインディングを調整するための

実験的インタフェースを提供します。それらは、個々のバインディングと同様に環境をロックすること、変数を関数にリンクすることを可能にします。

これは(非const変数へconstポインタのような)誤った安心感を与えることができるものの一種のように思えるが、それは役立つかもしれません。

(編集用)constcompile-time guaranteeで、メモリ内のビットをロックダウンしません。 Rにはすべてのコードを一度に見るコンパイル段階がないため(インタラクティブな使用のために構築されています)、将来の命令が保証に違反しないことを確認する方法はありません。これを行う正しい方法があれば、R-helpの人々が知っているでしょう。私の提案された回避策:自分の編集を偽ってください。 「定数」変数の各表示に対応するリテラルを手動で代用するRコードを前処理するスクリプトを作成します。

(オリジナル:) C "const"のように動作する変数を持つことから得たいと望んでいるのは何ですか?

Rは(環境によっては別のことをしない限り)もっぱらcall-by-value semanticsなので、関数を呼び出すことで変数が壊れる心配はありません。あなたとあなたの共同作業者が同じ名前の変数を誤って使用することを心配しているなら、何らかの種類の命名規則を採用したり、いくつかのOOP構造を使用することはおそらく適切な解決策です。

あなたが探している機能が存在する可能性がありますが、あなたの行動を元に戻すことができる対話型の環境として、Rの起源を考えると疑いがあります。

+0

私は、関数を呼び出すことによって変数を壊すことを心配していません。私は、環境内で提供される特定の変数が決して変更されないことを保証したいと思います。私は基本的に一連の解析ツールを定義していますが、プログラムの実行中に変更してはならない処理の定数をいくつか定義しています。 R. –

+1

では "定数"に分かりやすい名前がついていて、ユーザーが変更した場合に悪いことが起こったと知っていれば、責任を免れることができ、必要に応じて専門のユーザーが変更することができます。言われるように、「定数はありません、変数はありません」。 – Spacedman

5

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

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

が次にあなたがするではないかを知るために補佐官の回顧録を持っており、また、それはあなたの通常の名前空間からそれらをプッシュ。

他の場所はR開発メーリングリストです。お役に立てれば。

1

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

6

コードを他人に配布する予定があるので、パッケージの作成を検討する必要がありますか?そのパッケージ内にNAMESPACEを作成します。一定の値を持つ変数を定義することができます。少なくともあなたのパッケージが使用する機能に。 Tierney (2003) Name Space Management for R