2013-09-21 13 views
8

Der Titel ist nicht wirklich beschreibend, da das Problem länger ist als ein vernünftiger Titel, den ich mir vorstellen könnte.Objektnamen aus einer Funktion herausholen

Ich möchte eine Funktion haben, die Objektnamen aus anderen Funktionen ergreift, die als Argumente in einer anderen Funktion verwendet werden können. Hier ist ein Barebone-Versuch:

grab <- function(x) { 
    as.character(substitute(x)) 
} 

FUN <- function(foo, bar = grab(foo)) { 
    bar 
} 

FUN(mtcars) 

hier Ichs Mangel FUN die Zeichenfolge „mtcars“ zurückzukehren, aber es gibt „foo“. Wie könnte eine Grab-Funktion machen, die dies tut (Ich möchte dies tun, weil ich dies als Standard für eine TXT/CSV-Datei verwenden werde. Es ist eine Komforteinstellung.

Hier sind einige erfolglose Versuche (aber ich möchte eine generische Greiffunktion haben):

FUN2 <- function(foo, bar = as.character(substitute(bar))) { 
    bar 
} 

FUN2(mtcars) 

#================== 

FUN3 <- function(foo, bar) { 
    if(missing(bar)) bar <- foo 
    as.character(substitute(bar)) 
} 

FUN3(mtcars) 

Real life-ish Beispiel:

real_example <- function(obj, file = grab(obj)) { 
    write.csv(obj, file = sprintf("%s.csv", file)) 
} 
+0

Fühlen Sie sich frei Titel zu bearbeiten oder zu bearbeiten klarer zu machen. –

+0

Diese Frage sieht sehr ähnlich aus: http://stackoverflow.com/questions/5754367/using-substitute-to-get-argument-name-with – Frank

+0

@Frank hast du irgendeine dieser Antworten zu arbeiten? –

Antwort

6

Sie sys.call könnten versuchen, Zugriff auf den Parent Anruf zu erhalten:

## "which" is the number of the argument of interest 
grab <- function(which) { 
    ## which + 1, because [1] == name of function/call 
    ## and arguments are 2:n 
    as.character(sys.call(-1L)[which+1L]) 
} 

FUN <- function(foo, bar = grab(1L)) { 
    bar 
} 

FUN(mtcars) 
# "mtcars" 
+0

Dies ist das Verhalten, das ich suche. Ich werde es abwägen, die Antwort zu überprüfen, falls andere eine bessere Option haben (d. H. Jemand weist darauf hin, dass etwas fehlerhaft ist). –

+0

+1. Ja, wie Tyler sagt, wenn es nichts falsch daran ist, es so zu machen (anstatt den Namen "mtcars" zu geben und "get" zu verwenden), könnte ich das auch benutzen. – Frank

6

Wie wäre es damit?

grab <- function(x) as.character(x[["foo"]]) 
FUN <- function(foo, bar=grab(match.call())) { bar } 

FUN(mtcars) 
# [1] "mtcars" 
+0

Das funktioniert auch. +1 –

Verwandte Themen