2014-06-19 9 views
9

Ich stapelte mit dem Versuch, Variable durch wenige Funktionen zu übergeben, und auf die letzte Funktion möchte ich den Namen der ursprünglichen Variablen erhalten. Aber es sieht so aus, als ob die Ersatzfunktion in R nur in einer "lokalen" Umgebung oder nur für eine Ebene höher wäre. Nun, lassen Sie mich erklären es durch Code:Wie Name der Variablen in R (Ersatz) erhalten?

fun1 <- function (some_variable) {deparse(substitute(some_variable)} 
fun2 <- function (var_pass) { fun1 (var_pass) } 
my_var <- c(1,2) # I want to get 'my_var' in the end 
fun2 (my_var) # > "var_pass" 

Nun, es scheint, als ob wir den Namen der variablen Druck, die sich nur auf die fun1 passieren. Die Dokumentation des Ersatzes sagt uns, dass wir env Argument verwenden können, um anzugeben, wo wir hinschauen können. Aber indem .Global oder .BaseNamespaceEnv als Argument zu ersetzen Ich habe noch mehr seltsame Ergebnisse - „some_variable“

Ich glaube, die Antwort in dieser Funktion ist env Argument mit der Verwendung, so könnten Sie bitte erklären, mir wie es funktioniert und wie ich bekomme was ich brauche. Danke im Voraus!

+0

Ziemlich sicher "The R-Inferno" berührt dies. Übrigens, ich nehme an, du wolltest 'fun1' in' fun2' mit 'var_pass' nennen? –

+0

Oh, danke! Ja, ich meinte fun1 (var_pass). – EvilAnton

+0

Warum brauchen Sie den Namen an erster Stelle? Es gibt wahrscheinlich eine gute, einfachere Alternative. –

Antwort

9

Ich schlage vor, dass Sie erwägen, optionalen Wert für diese Funktionen zu übergeben. Ich sage das, weil es so aussieht, als ob Sie den Namen wirklich als Bezeichnung für etwas im Endergebnis verwenden möchten; Es ist also nicht wirklich die Variable selbst, die so wichtig ist wie ihr Name. Sie könnten

fun1 <- function (some_variable, name=deparse(substitute(some_variable))) { 
    name 
} 
fun2 <- function (var_pass, name=deparse(substitute(var_pass))) { 
    fun1 (var_pass, name) 
} 
my_var <- c(1,2) 

fun2(my_var) 
# [1] "my_var" 

fun1(my_var) 
# [1] "my_var" 

Auf diese Weise tun, wenn Sie einige ungeradeen Variablennamen am Ende mit und was einen besseren Namen zu einem Ergebnis zu geben, müssen Sie zumindest die Option. Und standardmäßig sollte es tun, was Sie wollen, ohne den Parameter name zu verlangen.

+0

Dieser ist interessant!)) Aber das Problem denke ich im R selbst. Ich würde sogar in der init() Schritt Name Parameter hinzufügen, aber wie ich bereits gesagt habe, ist es nicht die bequeme Art mit data.frames – EvilAnton

+1

Ich entziffern nicht Ihren Kommentar @EvilAnton. Ich bin mir nicht sicher, was der 'init()' Schritt ist oder wie dies speziell mit data.frames zusammenhängt. Wenn Sie 'name' verwenden möchten, um eine Spalte aus Daten zu extrahieren.Rahmen, können Sie 'df [, name]' verwenden, wenn der Wert in 'name' genau mit einem der Spaltennamen übereinstimmt. – MrFlick

+0

Init Schritt ich meinte. Wenn Sie alle Daten in den Arbeitsbereich laden. Aber eigentlich hast du einen guten Punkt gemacht. Wenn einige der Spaltennamen umbenannt werden sollen, sollte es funktionieren. – EvilAnton

0

Ein Hack, wahrscheinlich nicht der beste Weg:

fun2 <- function (var_pass) { fun1 (deparse(substitute(var_pass))) } 

fun1 <- function (some_variable) {(some_variable))} 

fun2(my_var) 
# "my_var" 

Und Sie get auf das laufen könnte. Aber wie Paul H, schlägt vor, gibt es bessere Möglichkeiten, Variablen zu verfolgen.

+0

Wenn jemand mich dorthin führen kann, wo ich nach dem besseren Weg suche, würde ich es wirklich schätzen :) – EvilAnton

+0

Nun, eine Möglichkeit, das zu machen, was ich brauche, ist, Char über Funktionen zu übergeben und einfach get() zu verwenden. . Aber es sieht für mich nicht gut aus, zumindest von der Art der Programmierung von Architektur. – EvilAnton