Enum-wie Argumente in R
Ich bin neu in R, und ich bin versucht derzeit, die Versorgung der Aufzählung-wie argument der R-Funktion (oder der RC/R6-Methode der Klasse), derzeit nutze ich Zeichen-vector plus match.arg
die der folgenden ähnelt:
EnumTest = function(enum = c("BLUE", "RED", "BLACK")) {
enumArg <-
switch(
match.arg(enum), "BLUE" = 0L, "RED" = 1L, "BLACK" = 2L
)
switch(enumArg,
# do something
)
}
Ist es besser/übersichtlicher Art und Weise zu imitieren enum-wie Verhalten in R? E. g. ein großes problem, dass Nutzer muss wissen, die Menge der möglichen Werte für das argument und geben Sie als string - ohne jede suggestion oder auto-Vervollständigung...
Wenn es keine andere bessere Weise, eine Sache, die sich verbessern konnten obigen Ansatz - es wäre schön, um es kompakt von sagen Vorbelegung von Enumerationen, die Global oder zu sagen, wie private Mitglieder R6 Klasse:
Color <- c("BLUE", "RED", "BLACK")
Dann könnte man (wieder -) verwenden Sie es in einem oder mehreren Funktions-Definitionen, z.B.:
EnumTest = function(enum = Color) {
...
Allerdings bin ich mir nicht sicher, wie Sie diese Color
Vektor in match.arg
Funktion. Es wäre schön, wenn ich definieren könnte Color
als eine Karte mit Schlüssel tatsächlichen Farbwerte und die Werte integer Darstellung - aber ich bin mir nicht sicher, wie sinnvoll das ist.. na ja, vielleicht gibt es mehr gemeinsame nette Ansätze vorhanden.
Das wichtigste Ziel wäre es, eine einfach zu bedienende intuitive Schnittstelle, um die Benutzer von mein Paket und die Funktionen (z.B. die einfache Möglichkeit zu finden, die Menge der möglichen Werte, tab-Vervollständigung, auto-suggestion, etc..), gefolgt von standardisierten Entwicklung solcher Funktionen, die mit enum-wie Argumente
- Was ist mit Faktoren? Sie sind im Grunde built-in enums
- Könnten Sie bitte erweitern oder bieten Beispiel, wenn möglich? Habe ich mir angeschaut Faktoren kurz aber hatte nicht bemerkt, wie Sie besser werden können in der oben genannten Argumente Aufgabe.. es ist eine riesige chance, dass ich etwas übersehen
- Ja, ich verstehe das. Meine Frage ist, wie man richtig verwenden Sie für die übergabe von Argumenten... Wenn ich definieren, sagen
func <- function(enum = factor(c("a", "b", "c"))
- und Benutzer-Anrufefunc(enum = "a")
dann innerhalb der Funktionenum
argument ist nur ein Charakter.. ich bin mir nicht sicher, ob es überhaupt möglich ist, um die int-Darstellung - und wie ist es schlimmer als das, was Sie jetzt mit array von chars? Es ist deutlich besser, Faktoren, Ebenen und Ordnung, und Sie könnte konvertieren von zugrunde liegenden integer zu string und wieder zurück, etc.
- Ich sage nicht, dass es noch schlimmer :), Nur versuchen zu verstehen..., wie man richtig verwenden Sie in diesem speziellen Fall
- Ich würde den Faktor Farbe und legen Sie es in umschließenden Umgebung. Übergabe in/out entweder Ganzzahlen oder Zeichenfolgen und überprüfen Sie Sie gegen die Farbe Faktor, Konvertierung zu/von int verwenden es, im Grunde, wie gesagt
It'd be nice if I could define Color as a map with keys being actual color values and values being integer representation
- ok, vielen Dank. obwohl ich nicht sicher bin, wie
verify them against Color factor, convert to/from int using it
effizient/kompakt
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie wäre es mit einer Funktion, die definiert, die enum-durch Rücksendung
list(a= "a", ...)
? Sie können dann entweder weisen Sie den zurückgegebenen Vektor einer Variablen zu, und verwenden Sie es im Kontext, oder verwenden Sie die Funktion direkt. Entweder ein name oder eine integer-Referenz funktioniert wie ein index, obwohl Sie die unlist version des index-lookup[[
, sonst bekommt man eine Liste mit einem element.Können Sie die Liste der Namen für die Verwendung in einem match, d.h. Ihre Funktion parameter könnte
Kann man eigentlich abkürzen, aber es muss eindeutig sein. (Wenn Sie mit RStudio, da
col
ist eine Liste, es schlägt Ergänzungen!)Wenn Sie wollen mehr anspruchsvolle enum Handhabung, die man zuordnen könnte S3-Klassen, um die Sache zurückgegeben, indem Sie Ihre enum-Konstruktor-Funktion und schreiben Sie eine kleine Sammlung von Funktionen zum Versand auf die Klasse "enum" und ermöglichen groß-und Kleinschreibung Indizierung. Sie könnten auch spezielle Funktionen zum arbeiten mit einer bestimmten Klasse, z.B. "colorEnum"; ich habe dies nicht getan hier. Vererbung bedeutet, dass die Liste mit access-Methoden, die alle noch funktionieren.
Diese überschreiben Sie die eingebaute
[
,[[
und$
Funktionen, wenn das Ding indiziert ist Klasse "enum", für jedes "enum" eingestuft Objekte. Wenn Sie einen weiteren benötigen, brauchen Sie nur, um Sie zu definieren.Wenn Sie mehrere enum-Objekte, fügen Sie eine factory-Funktion
enum
nimmt einen Vektor von Zeichenketten und einen Namen und gibt eineenum
Objekt. Die meisten dieser ist nur zur überprüfung.Aber das ist jetzt angefangen zu schauen, wie ein Paket...
Möchte ich-Umgebungen als Ersatz für enums, da können Sie diese sperren, um zu verhindern, dass alle änderungen, die nach der Schöpfung. Ich definiere meine Kreation Funktion wie diese:
Erstellen Sie ein neues enum-so:
Können wir den Zugriff auf die Werte:
Aber wir können nicht ändern oder neue erstellen:
values <- sapply(match.call(expand.dots = TRUE)[-1L], deparse)
Ich nur konfrontiert, die genau dieses problem und konnte nur finden das SO Frage. Die Objekteigenschaften Paket Erwähnung von Paul scheint aufgegeben (es giebt mehrere Warnungen) und hat viel Aufwand für so eine einfache (im Prinzip) problem. Ich kam mit der folgenden leichten Lösung (hängt nur von der
stringi
- Paket), die reproduziert das Gefühl von Enumerationen in C-Sprachen. Vielleicht hilft dies ja jemanden.Hier ist eine einfache Methode, die unterstützt Enumerationen, die mit zugewiesenen Werte oder die Verwendung der Namen, wie der Wert standardmäßig:
Wenn Sie einfach versuchen, machen Sie eine Liste mit Namen und kümmern sich nicht um die Werte, die Sie verwenden können, wie diese:
Wenn Sie wollen, können Sie die Werte:
In jedem Fall ist es leicht, auf das enum-Namen, weil der code-Vervollständigung:
Überprüfen, ob eine variable einen Wert im enum können Sie überprüfen, wie dieses:
Update 07/21/2017: ich habe ein Paket für Aufzählungen in R:
https://github.com/aryoda/R_enumerations
Wenn Sie verwenden möchten, die Sie selbst definiert enum-alike-Datentypen die als Argumente der R-Funktionen, dass die Unterstützung
definieren Sie Ihre eigenen
match.enum.arg
- Funktion, e. g.:Verwendung:
Können Sie dann definieren Sie und verwenden Sie Ihre eigenen enums wie diese:
Beispiel-Aufrufe:
Sehen Enum-Klasse {Objekteigenschaften} | - innen-R | Eine Community-Site für R.