151 votes

Dans R, comment obtenir le nom d'un objet à partir de l'objet lui-même?

Je cherche l'inverse de get() .

Étant donné un nom d'objet, je souhaite que la chaîne de caractères représentant cet objet soit extraite directement de l'objet.

Exemple trivial avec foo comme espace réservé pour la fonction que je cherche.

 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)
 

Souhaitez imprimer:

   "z"
 

Mon travail autour, qui est plus difficile à implémenter dans mon problème actuel est:

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

test("z")
 

175voto

BondedDust Points 105234

Le vieux truc du substitut déparse:

 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"
#[1] 5.5
 

Edit: l'a exécuté avec le nouvel objet-test

Remarque: cela n’aboutira pas dans une fonction locale si un ensemble d’éléments de la liste est transmis à lapply . Vous pourriez extraire l'attribut .Names et l'ordre de traitement du résultat de la structure, s'il s'agissait d'un vecteur nommé en cours de traitement.

 > 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]]"  
 

7voto

Eli Holmes Points 16

Notez que pour les méthodes d'impression, le comportement peut être différent.

 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
 

D'autres commentaires que j'ai vus sur les forums suggèrent que le dernier comportement est inévitable. Ceci est regrettable si vous écrivez des méthodes d'impression pour les packages.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X