2012-05-09 4 views
84

私はget()の逆を探しています。Rでは、関数に送信された後にオブジェクトの名前を取得する方法は?

オブジェクト名を指定すると、そのオブジェクトを表す文字列をオブジェクトから直接抽出したいと考えています。

私が探している機能のプレースホルダーであるfooの簡単な例です。

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) 

は印刷されます:

"z" 

を周りに私の仕事、私の現在の問題で実現が困難であるある:

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

test("z") 
+20

は私が考えることになり、 '逆パース(代替(...)) 'があなたの後ろにあるもの – Chase

+2

" z "という変数と" * "*" z "と呼ばれる変数を持っているにもかかわらず、悪い例です..." z "あなたは正しくそれをした;-) – Tommy

+0

@トミー、それを改善しようとしましたが、あなたが望むならば編集で改善してください。 –

答えて

104

古い逆パース - 代替トリック:

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 

編集:新しいテスでそれを実行するt-object

注:リスト項目のセットがlapplyに渡されたときに、これはローカル関数内では成功しません(オブジェクトがfor -loopに与えられたリストから渡されたときにも失敗します)。処理中の名前付きベクトルの場合は、構造体の結果から.Names属性と処理の順番を抽出することができます。

> 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

印刷方法については、動作が異なる可能性があることに注意してください。

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 

その他のコメント私がフォーラムで見たことは、最後の動作が避けられないことを示しています。パッケージの印刷メソッドを書いている場合、これは残念です。引用は、VARまたは式の評価 からと解析関数の逆です逆パース機能を凍結する

+0

おそらく、 'print.foo = function(x){cat(deparse(substitute(x))}}'または 'print.foo = function(x){print(deparse(substitute(x))、quote = FALSE)} ' –

+0

または' print.foo = function(x){print.default(as.list(x))} ' –

1
deparse(quote(var)) 

私の直感的な理解 はバックStringに凍結シンボルが

関連する問題