Bevor ich Lösungen anbiete, denke ich, es wäre am besten, ein Missverständnis über die Weitergabe von Argumenten anzugehen. Wenn Sie eine Funktion aufrufen als
func(num)
Sie nicht das Bestehen der Namen der Variablen als Argument Wert, sind vorbei Sie die Wert der Variablen als Argument Wert. Mit anderen Worten, wenn num
gleich 5 ist, dann übergeben Sie die Zahl 5. Wenn die Funktion die Standardargumentbewertung verwendet, dann wird ihr der Variablenname, der im Argument verwendet wurde, nicht bekannt sein, oder selbst wenn es a gab Variablenname überhaupt (es darf nicht vorkommen, wenn der Argumentwert aus einem Literal oder einem Ausdruck erzeugt wurde).
Wenn Sie die Variablennamen als Argument Wert übergeben wollen, müssen Sie es zitieren:
func('num')
Davon abgesehen, gibt es etwas Nicht-Standard-Argument Auswertung genannt. R ist ziemlich ungewöhnlich, da es einen Mechanismus zum Abrufen des Argumentausdrucks bereitstellt, der an einen Parameter gebunden war, und dies könnte Ihnen tatsächlich ermöglichen, den Variablennamen aus der Funktion abzurufen. Die substitute()
10 Funktion wird oft für diesen Zweck verwendet. Der Variablenname, der als Argumentausdruck verwendet wird, muss nicht einmal einer vorhandenen Variablen entsprechen, damit dies funktioniert.
f <- function(x) as.character(substitute(x));
f(some.var);
## [1] "some.var"
viele Basisfunktionen R nutzen Nicht-Standard-Argument Bewertung, wie rm()
und library()
.
Es gibt mehrere Möglichkeiten zu tun, was Sie wollen.
1:assign()
assign()
Die Funktion kann eine parametrisierte Variablennamen in jeder Umgebung zuzuweisen verwendet werden. Das Ziel Ihrer Zuweisung scheint die globale Umgebung zu sein, die manchmal als Arbeitsbereichsumgebung bezeichnet wird und auf die mit globalenv()
(oder .GlobalEnv
) zugegriffen werden kann.
f <- function(x) assign(x,8,envir=globalenv());
num;
## Error: object 'num' not found
f('num');
num;
## [1] 8
2: Umgebung Zugang
Es ist möglich, eine Umgebung Objekt zu dereferenzieren und weisen Sie ihm zwar seltsam direkt, scheint es, dass Funktionsaufrufe oder Ausdrücke, die Umwelt Objekte zurückgeben kann nicht als lvalues verwendet werden, in diesen Weg. Mit anderen Worten, Sie müssen das Umgebungsobjekt in einer Variablen erfassen, bevor Sie es dereferenzieren und zuweisen können.
f <- function(x) { e <- globalenv(); e[[x]] <- 9; };
num;
## Error: object 'num' not found
f('num');
num;
## [1] 9
globalenv()$num <- 'why doesn\'t this work???';
## Error in globalenv()$num <- "why doesn't this work???" :
## invalid (NULL) left side of assignment
3:parse()
, eval()
und <<-
Wir können die superassignment Operator verwenden, um einen dynamischen Namen zuweisen, indem sie dynamisch zu bewerten.
f <- function(x) eval(parse(text=paste0(x,' <<- 10;')));
num;
## Error: object 'num' not found
f('num');
num;
## [1] 10
Jede der oben genannten Ansätze können mit Nicht-Standard-Argumente Auswertung kombiniert werden, zum Beispiel:
f <- function(x) assign(as.character(substitute(x)),11,envir=globalenv());
num;
## Error: object 'num' not found
f(num);
num;
## [1] 11
Sie sind ein globalen Zuweisungsoperator 'mit << -'. Sehen Sie sich die Zuweisungsoperatoren hier an: https://stat.ethz.ch/R-manual/R-devel/library/base/html/assignOps.html – Augustin
Ihr angestrebtes Ziel ist die Antithese von [funktionalem Programmieren] (http: // www : //adv-r.had.co.nz/Funktions-programmierung.html). Es wäre viel besser, sich an die Prinzipien der funktionalen Programmierung zu halten (z. B. sollten Funktionen keine Nebenwirkungen haben), da R unter diesen Gesichtspunkten entwickelt wurde. Vergessen Sie den Operator '<< -. – Roland
Vergessen Sie "Google Solutions" und lesen Sie einfach die R-Intro-Dokumente, die unter CRAN verfügbar sind> –