Ich möchte in R mehrere Variablen in einer einzigen Zeile zuweisen. Ist es möglich, so etwas zu tun?
values # initialize some vector of values
(a, b) = values[c(2,4)] # assign a and b to values at 2 and 4 indices of 'values'
Normalerweise möchte ich ungefähr 5-6 Variablen in einer einzelnen Zeile zuweisen, anstatt mehrere Zeilen zu haben. Gibt es eine Alternative?
list($a, $b) = array(1, 2)
? Das wäre nett! +1.vassign
Vorschlag unten kommt nahe ... :)X <- list();X[c('a','b')] <- values[c(2,4)]
. OK, Sie weisen sie nicht im Arbeitsbereich zu, sondern halten sie in einer Liste gut zusammen. Ich würde es lieber so machen.Antworten:
Auf dem Blog "Durch Probleme kämpfen" gibt es eine großartige Antwort
Dies wird von dort mit sehr geringfügigen Änderungen übernommen.
VERWENDUNG DER FOLGENDEN DREI FUNKTIONEN (Plus eine zum Zulassen von Listen unterschiedlicher Größe)
Dann ausführen:
Gruppieren Sie die linke Seite mit der neuen Funktion.
g()
Die rechte Seite sollte ein Vektor oder eine Liste sein. Verwenden Sie den neu erstellten Binäroperator%=%
Beispiel mit Listen unterschiedlicher Größe:
Längere linke Seite
Längere rechte Seite
quelle
Ich habe einen Zeallot für ein R-Paket zusammengestellt , um genau dieses Problem anzugehen. zeallot enthält einen Operator (
%<-%
) zum Entpacken, Mehrfach- und Destrukturieren. Die LHS des Zuweisungsausdrucks wird mithilfe von Aufrufen an erstelltc()
. Die RHS des Zuweisungsausdrucks kann ein beliebiger Ausdruck sein, der einen Vektor, eine Liste, eine verschachtelte Liste, einen Datenrahmen, eine Zeichenfolge, ein Datumsobjekt oder benutzerdefinierte Objekte zurückgibt oder ist (vorausgesetzt, es gibt einedestructure
Implementierung).Hier ist die erste Frage, die mit zeallot (neueste Version, 0.0.5) überarbeitet wurde.
Weitere Beispiele und Informationen finden Sie in der Paketvignette .
quelle
Erwägen Sie die Verwendung der in Basis R enthaltenen Funktionen.
Erstellen Sie beispielsweise einen 1-zeiligen Datenrahmen (z. B.
V
) und initialisieren Sie Ihre Variablen darin. Jetzt können Sie mehreren Variablen gleichzeitig zuweisenV[,c("a", "b")] <- values[c(2, 4)]
, jede mit name (V$a
) aufrufen oder viele gleichzeitig verwenden (values[c(5, 6)] <- V[,c("a", "b")]
).Wenn Sie faul werden und keine Variablen aus dem Datenrahmen aufrufen möchten, können Sie dies
attach(V)
(obwohl ich es persönlich nie tue).quelle
Hier ist meine Idee. Wahrscheinlich ist die Syntax recht einfach:
gibt so:
Dies ist jedoch nicht gut getestet.
quelle
c(c, d) %tin% c(1, 2) + 3
(=> c = 1, d = 1, numerisch () zurückgibt. 0)) kann als überraschend angesehen werden.Eine potenziell gefährliche
assign
Option (sofern die Verwendung riskant ist) wäreVectorize
assign
:Oder ich nehme an, Sie könnten es selbst manuell mit Ihrer eigenen Funktion vektorisieren, indem Sie
mapply
möglicherweise einen sinnvollen Standard für dasenvir
Argument verwenden. Gibt beispielsweiseVectorize
eine Funktion mit denselben Umgebungseigenschaften zurückassign
, wie in diesem Fallnamespace:base
, oder Sie können sie einfach festlegenenvir = parent.env(environment(assignVec))
.quelle
Wie andere erklärt haben, scheint nichts eingebaut zu sein. ... aber Sie können eine
vassign
Funktion wie folgt entwerfen :Eine zu berücksichtigende Sache ist jedoch, wie mit den Fällen umgegangen werden soll, in denen Sie z. B. 3 Variablen und 5 Werte angeben oder umgekehrt. Hier wiederhole (oder schneide) ich einfach die Werte, um die gleiche Länge wie die Variablen zu haben. Vielleicht wäre eine Warnung umsichtig. Aber es erlaubt Folgendes:
quelle
...()
, was für mich wie schwarze Magie aussieht ...?...()
ist extreme schwarze Magie ;-). Es kommt also vor, dass wenn der "Funktionsaufruf" ersetzt...()
wird, er zu einer Paarliste wird, an die übergeben werden kann,as.character
und voila, Sie haben die Argumente als Zeichenfolgen erhalten ...envir=parent.frame()
- Und Sie können zB angeben,envir=globalenv()
ob Sie möchten.`vassign<-` <- function (..., envir = parent.frame (), value)
und so weiter. Es scheint jedoch, dass das erste zuzuweisende Objekt bereits vorhanden sein muss. Irgendwelche Ideen?Erfüllte meinen Zweck, dh fünf Zwei in die ersten fünf Buchstaben zuzuweisen.
quelle
https://stat.ethz.ch/R-manual/R-devel/library/base/html/list2env.html :
quelle
Hatte kürzlich ein ähnliches Problem und hier war mein Versuch mit
purrr::walk2
quelle
Wenn Sie nur eine einzige Codezeile benötigen, wie wäre es dann mit:
quelle
Ich befürchte, dass es
c(a, b) = c(2, 4)
leider keine elegante Lösung gibt, nach der Sie (wie ) suchen . Aber gib nicht auf, ich bin mir nicht sicher! Die nächste Lösung, die ich mir vorstellen kann, ist diese:oder wenn Sie mit Warnungen belästigt sind, schalten Sie sie aus:
Aber ich nehme an, Sie sind mit dieser Lösung nicht zufrieden, ich wäre es auch nicht ...
quelle
quelle
Eine andere Version mit Rekursion:
Beispiel:
Meine Version:
Beispiel:
quelle
Wenn Sie einige der hier gegebenen Antworten + ein wenig Salz kombinieren, wie wäre es mit dieser Lösung:
Ich habe dies verwendet, um den R-Abschnitt hier hinzuzufügen: http://rosettacode.org/wiki/Sort_three_variables#R
Vorsichtsmaßnahme: Es funktioniert nur zum Zuweisen globaler Variablen (wie
<<-
). Wenn es eine bessere, allgemeinere Lösung gibt, pls. Sag es mir in den Kommentaren.quelle