Di R, bagaimana cara mendapatkan nama objek setelah dikirim ke suatu fungsi?

135

Saya mencari kebalikan dari get().

Diberi nama objek, saya ingin string karakter yang mewakili objek itu diekstraksi langsung dari objek.

Contoh sepele dengan foomenjadi pengganti untuk fungsi yang saya cari.

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)

Akan mencetak:

  "z"

Pekerjaan saya, yang lebih sulit untuk diterapkan dalam masalah saya saat ini adalah:

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

test("z")
Etienne Low-Décarie
sumber
35
Saya pikir deparse(substitute(...))apa yang Anda cari
Chase
2
Contoh buruk meskipun memiliki variabel yang disebut "z" dan parameter untuk menguji juga disebut "z" ... Mencetak "z" tidak benar-benar memberi tahu Anda jika Anda melakukannya dengan benar ;-)
Tommy
@Tommy, mencoba memperbaikinya, tapi tolong perbaiki dengan edit jika Anda mau.
Etienne Low-Décarie
Kebalikan dari getdalam R adalah assigntetapi saya tidak yakin itu yang benar-benar Anda cari ...
Tom Kelly

Jawaban:

160

Trik deparse-subtitusi lama:

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

Sunting: Lari dengan objek uji baru

Catatan: ini tidak akan berhasil di dalam fungsi lokal ketika satu set item daftar diteruskan dari argumen pertama ke lapply(dan juga gagal ketika suatu objek diteruskan dari daftar yang diberikan ke for-loop.) Anda akan dapat mengekstrak ".Names" -ditribusi dan urutan pemrosesan dari hasil struktur, jika itu adalah vektor bernama yang sedang diproses.

> 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]]"  
IRTFM
sumber
11
deparse(quote(var))

Pemahaman intuitif saya Di mana kutipan membekukan var atau ekspresi dari evaluasi dan fungsi deparse yang merupakan kebalikan dari fungsi parse membuat simbol yang dibekukan kembali ke String

perhitungan awan
sumber
6

Perhatikan bahwa untuk metode cetak perilaku dapat berbeda.

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

Komentar lain yang saya lihat di forum menunjukkan bahwa perilaku terakhir tidak dapat dihindari. Sangat disayangkan jika Anda menulis metode cetak untuk paket.

Eli Holmes
sumber
Mungkin seharusnya: print.foo=function(x){ cat(deparse(substitute(x))) }atauprint.foo=function(x){ print(deparse(substitute(x)), quote=FALSE) }
IRTFM
1
Atauprint.foo=function(x){ print.default(as.list(x)) }
IRTFM