2012-05-09 24 views
84

Ben get() tersinde arıyorum. R'de, bir işleve gönderildikten sonra bir nesnenin adı nasıl alınır?

ben nesneden doğrudan çıkarılan bu nesneyi temsil eden bir karakter dizesi sahibi olmak isteyen, bir nesne adı Verilen. foo aradığım fonksiyonu için yer tutucu olmak

Ö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ırmak istiyorum:

"z" 

benim şimdiki sorunu uygulamak zordur etrafında İşim şöyledir:

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

test("z") 
+20

Bence yapar 'deparse (yerine (...)) 'senin ne olduğunu test etmek için "z" olarak adlandırılan değişken ve parametre olması * Ayrıca * denilen "z" ... Baskı "z" gerçekten eğer size değil gerçi – Chase

+2

Kötü örnek sonra Bunu doğru bir şekilde yaptıysanız ;-) – Tommy

+0

@ Tommy, bunu geliştirmeye çalıştı, ancak isterseniz dilerseniz düzenlemeyle geliştirin. –

cevap

104

eski deparse-yerine hüner:

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 tes ile Ran t-object

Not: Bu liste, bir liste öğesi öğesi lapply'a iletildiğinde (ve ayrıca bir nesne bir for -loop'a verilen listeden geçirildiğinde de başarısız olduğunda) yerel bir işlev içinde başarılı olmaz. İşlenmekte olan adlandırılmış bir vektör olsaydı, .Names özniteliğini ve işlem sırasındaki işlem sırasını ayıklayabilmek.

> 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]]" 
2

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österir. Paketler için baskı yöntemleri yazıyorsanız bu talihsiz bir durumdur. alıntı değişken ya da ifadeyi değerlendirme gelen ve ayrıştırma işlevinin tersidir deparse fonksiyonunu dondurmak hangi

+0

Belki de olması gerekir: 'print.foo = fonksiyonu (X) {kedi (deparse (yerine (x)))} 'ya da' print.foo = fonksiyonu (X) {baskı (deparse (yerine (x)), alıntı = FALSE)} ' –

+0

Veya' print.foo = işlev (x) {print.default (as.list (x))} ' –

1
deparse(quote(var)) 

Benim sezgisel anlayış geri String donmuş sembol

İlgili konular