R'de, bir işleve gönderildikten sonra nesnenin adı nasıl alınır?


136

Tersini arıyorum get().

Bir nesne adı verildiğinde, o nesneyi temsil eden karakter dizesinin doğrudan nesneden çıkarılmasını istiyorum.

fooAradığım işlevin yer tutucusu olmakla ilgili önemsiz bir örnek .

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)

Yazdırılacaktı:

  "z"

Şu anki sorunumda uygulaması daha zor olan çalışmalarım:

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

test("z")

35
Sanırım deparse(substitute(...))peşinde olduğun şey
Chase

2
Kötü bir örnek, "z" adlı değişkene ve test edilecek parametrenin "z" olarak da adlandırılmasına sahip olmak ... "z" yazdırmak size bunu doğru yapıp yapmadığınızı gerçekten söylemez ;-)
Tommy

@Tommy, onu iyileştirmeyi denedi, ancak isterseniz lütfen düzenleyerek geliştirin.
Etienne Low-Décarie

getR harfinin tersi assignama gerçekten aradığınız şeyin bu olduğundan emin değilim ...
Tom Kelly

Yanıtlar:


161

Eski ayrılık ikame numarası:

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

Düzenleme: Yeni test nesnesiyle çalıştırdı

Not: Bu, yerel bir işlev içinde, ilk bağımsız değişkenden bir liste öğesi kümesi iletildiğinde başarılı olmaz lapply(ve ayrıca bir nesne- fordöngüye verilen bir listeden iletildiğinde başarısız olur ). ".Adlar" -öznitelik ve işlenmekte olan adlandırılmış bir vektör olsaydı, yapıdan işlem sırası sonucu.

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

Benim sezgisel anlayışım, alıntıda var veya ifadeyi değerlendirmeden dondurur ve ayrıştırma işlevinin tersi olan deparse işlevi, bu donmuş sembolü String'e geri getirir


6

Yazdırma yöntemleri için davranışın farklı olabileceğini unutmayın.

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

Forumlarda gördüğüm diğer yorumlar, son davranışın kaçınılmaz olduğunu gösteriyor. Paketler için yazdırma yöntemleri yazıyorsanız, bu talihsiz bir durumdur.


Belki şöyle olmalıdır: print.foo=function(x){ cat(deparse(substitute(x))) }veyaprint.foo=function(x){ print(deparse(substitute(x)), quote=FALSE) }
IRTFM

1
Veyaprint.foo=function(x){ print.default(as.list(x)) }
IRTFM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.