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