web-dev-qa-db-fra.com

Dans R, comment obtenir le nom d'un objet après son envoi à une fonction?

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 étant l’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")
113

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"   ... 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: l'a exécuté avec le nouvel objet-test

Remarque: cela ne réussira pas dans une fonction locale lorsqu'un ensemble d'éléments de la liste est passé du premier argument à lapply (et il échoue également lorsqu'un objet est passé d'une liste donnée à un for -loop.) Vous pourrez 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]]"  
138
42-
deparse(quote(var))

Ma compréhension intuitive Dans laquelle la citation gèle la variable ou l'expression de l'évaluation et la fonction deparse, qui est l'inverse de la fonction d'analyse, ramène ce symbole figé à String

6
cloudscomputes

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.

5
Eli Holmes