2016-05-19 5 views
1

Ich bin sehr viel ein Anfänger für R, und hatte Probleme, Google-Lösungen für mein Problem zu googlen, denn obwohl ich bin mir sicher, dass es ein sehr grundlegendes Problem ist, finde ich es schwierig zu erklären, was ich tun möchte. Ich schätze, dass stackoverflow nur für ernsthafte Programmierer ist, also wenn jemand nur auf die Frage eines anderen verweisen kann, die sich mit dem gleichen Thema befasst, wäre ich unglaublich dankbar. Mit diesem gesagt:Wie erstellt man eine Variable innerhalb einer Funktion, die ihren Namen von einem Argument innerhalb von R hat?

Was ich tun möchte, ist eine Funktion in der Lage sein zu lesen und zuweisen den Namen eines Vektors, nicht nur seinen Inhalt. Als ich schrieb:

num <- 5 
func <- function(x) { 
    x <<- 8 
} 
func(num) 

Ich dachte, es würde einen neuen Vektor namens "num" erstellen. - wie in, wäre es mag es zu lesen:

func(num) 
num <<- 8. 

Aber stattdessen entweder es schafft nur einen neuen Vektor wahrsten Sinne des Wortes „x“ genannt wird, und ordnet „8“, um es, oder er versucht, „8“ zuzuordnen "5", ich kann nicht wirklich sagen was. Wie auch immer, wie kann ich R sagen, dass ich das, was ich in dem Argument geschrieben habe, als Vektornamen verwenden soll?

+1

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

+2

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

+1

Vergessen Sie "Google Solutions" und lesen Sie einfach die R-Intro-Dokumente, die unter CRAN verfügbar sind> –

Antwort

3

Sie können die Return-Anweisung der Funktion für diesen Einsatz:

num = 5 
func = function(x) { 
    return(x) 
} 
num = func(8) 
num 
# [1] 8 

Siehe auch this tutorial I wrote, dies auf Funktionen einige mehr in die Tiefe informatie bietet, Scoping usw.

Beachten Sie auch, dass in der Regel dort ist keine Notwendigkeit für den <<- Operator, da dies zu schwer verständlichen Code führen kann. Siehe zum Beispiel this SO post.

+1

Danke, lies! Ich habe die Angewohnheit, den << - Operator zu benutzen, damit ich nach dem Ausführen der Funktion sehen kann, was in den verschiedenen Vektoren ist (sonst existieren sie nur in der Funktionsumgebung, denke ich?) Ich habe nicht bemerkt, dass es den Code macht schwer zu verstehen, so wird es von nun an zu vermeiden, danke. – Kalia

1

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 
Verwandte Themen