2013-09-21 13 views
8

考えられるタイトルよりも長い問題が長いため、タイトルはわかりやすいものではありません。関数内からオブジェクト名を取得する

他の関数の引数として使用できる他の関数からオブジェクト名を取得する関数が必要です。ここでは必要最小限の試みです:

grab <- function(x) { 
    as.character(substitute(x)) 
} 

FUN <- function(foo, bar = grab(foo)) { 
    bar 
} 

FUN(mtcars) 

ここで私のはFUNは、文字列「mtcars」を返すようにしたいが、それは「foo」を返します。どのようにこれを行うグラブ関数を作ることができましたか(私はこれをデフォルトのtxt/csvファイルに使用するので、これをやりたいのですが)便利な設定です

いくつか失敗しましたしかし、私は)一般的なグラブ機能を持つようにしたい:

FUN2 <- function(foo, bar = as.character(substitute(bar))) { 
    bar 
} 

FUN2(mtcars) 

#================== 

FUN3 <- function(foo, bar) { 
    if(missing(bar)) bar <- foo 
    as.character(substitute(bar)) 
} 

FUN3(mtcars) 

実生活っぽい例:

real_example <- function(obj, file = grab(obj)) { 
    write.csv(obj, file = sprintf("%s.csv", file)) 
} 
+0

タイトルを編集または編集して、これをより明確にしてください。 –

+0

この質問は非常によく似ています:http://stackoverflow.com/questions/5754367/using-substitute-to-get-argument-name-with – Frank

+0

@フランクあなたはこれらの応答のいずれかを稼働させましたか? –

答えて

6

あなたは親コールへのアクセスを得るためにsys.callを試みることができる:

## "which" is the number of the argument of interest 
grab <- function(which) { 
    ## which + 1, because [1] == name of function/call 
    ## and arguments are 2:n 
    as.character(sys.call(-1L)[which+1L]) 
} 

FUN <- function(foo, bar = grab(1L)) { 
    bar 
} 

FUN(mtcars) 
# "mtcars" 
+0

これは私が探している動作です。他の人がより良い選択肢を持っている場合(つまり、誰かがこれで何か不具合を指摘している場合)には、回答としてチェックを止めます。 –

+0

+1。ええ、タイラーが言っているように、このようにしても何の問題もなければ(「mtcars」という名前をつけて「get」を使うのではなく)、これも使うかもしれません。 – Frank

6

これはいかがですか?

grab <- function(x) as.character(x[["foo"]]) 
FUN <- function(foo, bar=grab(match.call())) { bar } 

FUN(mtcars) 
# [1] "mtcars" 
+0

これも機能します。 +1 –

関連する問題