Em R, como obter o nome de um objeto depois que ele é enviado para uma função?


135

Estou procurando o inverso de get().

Dado o nome de um objeto, desejo que a cadeia de caracteres que representa esse objeto seja extraída diretamente do objeto.

Exemplo trivial de fooser o espaço reservado para a função que estou procurando.

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)

Imprimiria:

  "z"

Minha solução, mais difícil de implementar no meu problema atual, é:

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

test("z")

35
Eu acho que deparse(substitute(...))é o que você está depois
perseguição

2
Exemplo ruim, porém, de ter a variável chamada "z" e o parâmetro a ser testado também chamado de "z" ... A impressão de "z" não informa se você fez corretamente ;-)
Tommy

@ Tommy, tentou melhorá-lo, mas por favor melhore com a edição, se desejar.
Etienne Low-Décarie

O oposto de getem R é assign, mas eu não tenho certeza se é isso que você está realmente procurando ...
Tom Kelly

Respostas:


160

O velho truque de remoção de substituto:

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

Editar: executou com o novo objeto de teste

Nota: isso não terá êxito dentro de uma função local quando um conjunto de itens da lista for passado do primeiro argumento para lapply(e também falhará quando um objeto for passado de uma lista fornecida para um forloop). Você seria capaz de extrair o Atributo ".Names" e a ordem de processamento do resultado da estrutura, se fosse um vetor nomeado que estava sendo processado.

> 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))

Meu entendimento intuitivo Em que a citação congela a var ou expressão da avaliação e a função de separação, que é a função inversa de análise, faz com que o símbolo congelado volte para String


6

Observe que, para os métodos de impressão, o comportamento pode ser diferente.

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

Outros comentários que eu vi nos fóruns sugerem que o último comportamento é inevitável. Isso é lamentável se você estiver escrevendo métodos de impressão para pacotes.


Talvez devesse ser: print.foo=function(x){ cat(deparse(substitute(x))) }ouprint.foo=function(x){ print(deparse(substitute(x)), quote=FALSE) }
IRTFM

1
Ouprint.foo=function(x){ print.default(as.list(x)) }
IRTFM
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.