2009-06-01 7 views
28

Ich arbeite in R, und ich möchte einige Variablen definieren, die ich (oder einer meiner Mitarbeiter) nicht ändern kann. In C++ würde ich das tun:Deklarieren einer Const-Variable in R

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

Wie mache ich das in der R-Programmiersprache?

Edit für Klarheit: Ich weiß, dass ich Strings wie dies in R definieren:

path = "/projects/current" 

Was ich wirklich will, ist ein Sprachkonstrukt, das garantiert, dass niemand jemals den Wert mit der "benannte Variable zugeordnet ändern Pfad."

Bearbeiten, um Kommentare zu antworten:

Es technisch wahr ist, dass const eine Kompilierung-Garantie, aber es würde in meinem Kopf gültig sein, dass der R-Interpreter Anschlag Ausführung mit einer Fehlermeldung werfen würde. Zum Beispiel, schauen, was passiert, wenn Sie versuchen, Werte auf eine numerische Konstante zuweisen:

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

Also, was ich wirklich will, ist eine Sprache, mit der Sie Werte erlaubt einmal zuweisen und nur einmal, und es sollte eine gewisse Art sein of error, wenn Sie versuchen, einer Variablen, die als const deklariert ist, einen neuen Wert zuzuweisen. Es ist mir egal, ob der Fehler zur Laufzeit auftritt, besonders wenn es keine Kompilierungsphase gibt. Dies ist technisch gesehen vielleicht nicht durch die Wikipedia-Definition festgelegt, aber es ist sehr nahe. Es sieht auch so aus, als ob dies in der Programmiersprache R nicht möglich ist.

Antwort

34

Siehe lockBinding:

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

können Sie immer noch rm (a); a <-2 obwohl :) – Spacedman

-1

nahm ich die Antwort unten aus this website

Die einfachste Art von R-Expression ist nur ein konstanter Wert, in der Regel ein numerischer Wert (eine Zahl) oder ein Zeichenwert (ein Stück Text). Wenn wir beispielsweise eine Anzahl von Sekunden angeben müssen, die 10 Minuten entspricht, geben Sie eine Zahl an.

> 600 
[1] 600 

Wenn wir den Namen einer Datei angeben müssen, die wir wollen von Daten lesen, wir den Namen als Zeichenwert angeben. Zeichenwerte müssen mit doppelten Anführungszeichen oder einfachen Anführungszeichen umgeben sein.

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

Sie sind verwirrend Konstanten mit Variablen, die nicht einmal vergeben geändert werden kann. –

+0

@David Locke - Guter Punkt. Ich habe versucht, dies in der Frage zu klären. –

3

(für neue Idee Edited :) Die bindenv Funktionen bieten eine

experimentelle Schnittstelle für Anpassungen an Umgebungen und Bindungen innerhalb Umgebungen. Sie ermöglichen sowohl Sperrumgebungen als auch individuelle Bindungen und die Verknüpfung einer Variablen mit einer Funktion.

Dies scheint wie die Art von Dingen, die ein falsches Gefühl der Sicherheit (wie ein const Zeiger auf eine nicht const Variable) geben könnte, aber es könnte helfen.

(Bearbeitet für Fokus :) const ist ein compile-time guarantee, kein Lockdown auf Bits im Speicher. Da R keine Kompilierphase hat, in der es den gesamten Code auf einmal betrachtet (es ist für die interaktive Verwendung gebaut), gibt es keine Möglichkeit zu überprüfen, dass zukünftige Anweisungen keine Garantie verletzen. Wenn es einen richtigen Weg dafür gibt, werden die Leute von der R-help Liste wissen. Meine vorgeschlagene Problemumgehung: Fake deine eigene Zusammenstellung. Schreiben Sie ein Skript zur Vorverarbeitung Ihres R-Codes, der das entsprechende Literal für jede Darstellung Ihrer "konstanten" Variablen manuell ersetzt.

(Original :) Welchen Nutzen erhoffen Sie sich von einer Variablen, die sich wie ein C "const" verhält?

Da R ausschließlich call-by-value semantics ist (es sei denn, Sie tun etwas mit Umgebungen), gibt es keinen Grund, sich über das Umstürzen Ihrer Variablen Gedanken zu machen, indem Sie Funktionen auf ihnen aufrufen. Die Verwendung einer Art von Namenskonventionen oder einer OOP-Struktur ist wahrscheinlich die richtige Lösung, wenn Sie sich Sorgen machen, dass Sie und Ihre Mitarbeiter versehentlich Variablen mit denselben Namen verwenden.

Die Funktion, nach der Sie suchen, existiert möglicherweise, aber ich bezweifle es angesichts der Herkunft von R als eine interaktive Umgebung, in der Sie in der Lage sein möchten, Ihre Aktionen rückgängig zu machen.

+0

Ich mache mir keine Sorgen über Clobbering Variablen durch den Aufruf von Funktionen, ich möchte nur garantieren, dass bestimmte Variablen in der Umgebung nie verändert werden. Ich definiere grundsätzlich eine Reihe von Analysewerkzeugen, und ich definiere mehrere Konstanten für die Verarbeitung, die sich während der Ausführung des Programms nicht ändern sollten. Es scheint, dass dies in R. –

+1

knifflig/unmöglich sein kann, solange diese "Konstanten" sinnvolle Namen haben und Ihre Benutzer wissen, dass schlimme Dinge passieren, wenn sie sie ändern, dann können Sie die Verantwortung entbinden, und erfahrene Benutzer können sie bei Bedarf ändern. Wie das Sprichwort sagt, "Konstanten sind nicht, Variablen werden nicht". – Spacedman

5

Ich bin mir ziemlich sicher, dass dies in R nicht möglich ist. Wenn Sie besorgt sind, versehentlich den Wert neu zu schreiben, dann wäre die einfachste Sache, alle Ihre Konstanten in eine Listenstruktur zu setzen wissen Sie, wenn Sie diese Werte verwenden. Etwas wie:

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

Dann, wenn Sie darauf zugreifen müssen Sie haben ein Aide Memoire zu wissen, was nicht zu tun, und auch er drückt sie aus Ihrem normalen Namespace.

Ein anderer Platz, um zu fragen, wäre R Entwicklungsverteilerliste. Hoffe das hilft.

1

R hat keine Sprachkonstantenfunktion. Die obige Listenidee ist gut; Ich persönlich verwende eine Namenskonvention wie ALL_CAPS.

6

Da Sie planen, Ihren Code an andere zu verteilen, könnten Sie (sollten?) Ein Paket erstellen. Erstellen Sie in diesem Paket einen NAMESPACE. Dort können Sie Variablen definieren, die einen konstanten Wert haben. Zumindest für die Funktionen, die Ihr Paket verwendet. Werfen Sie einen Blick auf Tierney (2003) Name Space Management for R