2012-05-09 10 views
84

Ich suche die Rückseite von get().In R, wie erhält man den Namen eines Objekts, nachdem es an eine Funktion gesendet wurde?

Bei einem Objektnamen möchte ich die Zeichenkette, die das Objekt darstellt, direkt aus dem Objekt extrahieren lassen.

Trivial Beispiel mit foo ist der Platzhalter für die Funktion, die ich suche. Würde

z <- data.frame(x=1:10, y=1:10) 

test <- function(a){ 
    mean.x <- mean(a$x) 
    print(foo(a)) 
    return(mean.x)} 

test(z) 

drucken:

"z" 

Meine Arbeit um, das härter ist in meinem aktuellen Problem zu implementieren ist:

test <- function(a="z"){ 
    mean.x <- mean(get(a)$x) 
    print(a) 
    return(mean.x)} 

test("z") 
+20

Ich denke 'Deparse (Ersatz (...)) 'ist, was Sie nach – Chase

+2

Schlechte Beispiel obwohl die Variable namens" Z "und der Parameter zu testen * auch * namens" Z "... Drucken" Z "nicht wirklich sagen, ob Du hast es dann richtig gemacht ;-) – Tommy

+0

@Tommy, habe versucht es zu verbessern, aber verbessere bitte mit Edit wenn du willst. –

Antwort

104

Der alte Deparse-Ersatz Trick:

a<-data.frame(x=1:10,y=1:10) 
test<-function(z){ 
    mean.x<-mean(z$x) 
    nm <-deparse(substitute(z)) 
    print(nm) 
    return(mean.x)} 

test(a) 
#[1] "a" ... this is the side-effect of the print() call 
#   ... you could have done something useful with that character value 
#[1] 5.5 ... this is the result of the function call 

Edit: Ran es mit dem neuen tes t-Objekt

Hinweis: Dies wird nicht in einer lokalen Funktion erfolgreich sein, wenn eine Reihe von Listenelementen an lapply weitergegeben Sie würden (und es nicht auch, wenn ein Objekt aus einer Liste zu einem for -loop gegeben geben wird.) in der Lage sein, das .Names-Attribut und die Reihenfolge der Verarbeitung aus dem Strukturergebnis zu extrahieren, wenn es sich um einen benannten Vektor handelt, der gerade verarbeitet wird.

> lapply(list(a=4,b=5), function(x) {nm <- deparse(substitute(x)); strsplit(nm, '\\[')}) 
$a 
$a[[1]] 
[1] "X" ""  "1L]]" 


$b 
$b[[1]] 
[1] "X" ""  "2L]]" 

> lapply(c(a=4,b=5), function(x) {nm <- deparse(substitute(x)); strsplit(nm, '\\[')}) 
$a 
$a[[1]] 
[1] "structure(c(4, 5), .Names = c(\"a\", \"b\"))" ""            
[3] "1L]]"           


$b 
$b[[1]] 
[1] "structure(c(4, 5), .Names = c(\"a\", \"b\"))" ""            
[3] "2L]]" 
2

Beachten Sie, dass für Druckmethoden das Verhalten unterschiedlich sein kann.

Andere Kommentare Ich habe in Foren gesehen, dass das letzte Verhalten unvermeidlich ist. Das ist bedauerlich, wenn Sie Druckmethoden für Pakete schreiben.

+0

Vielleicht sollte es sein: 'print.foo = function (x) {cat (deparse (substituieren (x)))}' oder 'print.foo = funktion (x) {drucken (deparse (ersetzen (x)), zitieren = FALSE)} ' –

+0

Oder' print.foo = Funktion (x) {print.default (as.list (x))} ' –

1
deparse(quote(var)) 

Mein intuitives Verständnis , in dem das Zitat und die Deparse Funktion var oder Ausdruck aus der Auswertung einzufrieren, die die Umkehrung der Parsing-Funktion macht das frorene Symbol zurück zu String

Verwandte Themen