Wie erhalte ich in R den Namen eines Objekts, nachdem es an eine Funktion gesendet wurde?


134

Ich suche das Gegenteil von get().

Bei einem gegebenen Objektnamen möchte ich, dass die Zeichenfolge, die dieses Objekt darstellt, direkt aus dem Objekt extrahiert wird.

Triviales Beispiel foodafür, der Platzhalter für die Funktion zu sein, die ich suche.

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)

Würde drucken:

  "z"

Meine Arbeit, die in meinem aktuellen Problem schwieriger umzusetzen ist, ist:

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

test("z")

34
Ich denke, es deparse(substitute(...))ist was Sie
Chase

2
Ein schlechtes Beispiel dafür, dass die Variable "z" und der zu testende Parameter auch "z" heißen ... Das Drucken von "z" sagt Ihnen nicht wirklich, ob Sie es dann richtig gemacht haben ;-)
Tommy

@ Tommy, habe versucht, es zu verbessern, aber bitte verbessern Sie mit bearbeiten, wenn Sie möchten.
Etienne Low-Décarie

Das Gegenteil von getin R ist, assignaber ich bin nicht sicher, ob Sie wirklich danach suchen ...
Tom Kelly

Antworten:


158

Der alte Trick des Ersatzes:

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: Lief es mit dem neuen Testobjekt

Hinweis: Dies ist in einer lokalen Funktion nicht erfolgreich, wenn eine Reihe von Listenelementen vom ersten Argument an übergeben wird lapply(und es schlägt auch fehl, wenn ein Objekt aus einer Liste übergeben wird, die an eine forSchleife übergeben wurde). Sie können das extrahieren ".Names" -Attribut und die Reihenfolge der Verarbeitung aus der Struktur ergeben sich, wenn es sich um einen benannten Vektor handelt, der 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]]"  

11
deparse(quote(var))

Mein intuitives Verständnis, bei dem das Zitat die Variable oder den Ausdruck aus der Auswertung einfriert und die Deparse-Funktion, die die Umkehrung der Parse-Funktion ist, macht dieses eingefrorene Symbol zurück zu String


5

Beachten Sie, dass das Verhalten bei Druckmethoden unterschiedlich sein kann.

print.foo=function(x){ print(deparse(substitute(x))) }
test = list(a=1, b=2)
class(test)="foo"
#this shows "test" as expected
print(test)

#this shows 
#"structure(list(a = 1, b = 2), .Names = c(\"a\", \"b\"), class = \"foo\")"
test

Andere Kommentare, die ich in Foren gesehen habe, deuten darauf hin, dass das letzte Verhalten unvermeidbar ist. Dies ist unglücklich, wenn Sie Druckmethoden für Pakete schreiben.


Vielleicht sollte es sein: print.foo=function(x){ cat(deparse(substitute(x))) }oderprint.foo=function(x){ print(deparse(substitute(x)), quote=FALSE) }
IRTFM

1
Oderprint.foo=function(x){ print.default(as.list(x)) }
IRTFM
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.