159

の逆を探していget()ます。

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

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

4 に答える 4

182

古いdeparse-substituteトリック:

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

編集:新しいテストオブジェクトで実行しました

注:これは、リスト項目のセットが最初の引数からに渡される場合はローカル関数内で成功しません(また、オブジェクトが-looplapplyに指定されたリストから渡される場合も失敗します)。 for".Names"-処理されていた名前付きベクトルの場合、構造体の結果からの属性と処理の順序。

> lapply( list(a=4,b=5), function(x) {nm <- deparse(substitute(x)); strsplit(nm, '\\[')} )
$a      # This "a" and the next one in the print output are put in after processing
$a[[1]]
[1] "X"    ""     "1L]]"  # Notice that there was no "a"


$b
$b[[1]]
[1] "X"    ""     "2L]]"

> lapply( c(a=4,b=5), function(x) {nm <- deparse(substitute(x)); strsplit(nm, '\\[')} )
$a
$a[[1]]   # but it's theoretically possible to extract when its an atomic vector
[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]]"  
于 2012-05-09T17:09:19.160 に答える
18
deparse(quote(var))

引用が評価から変数または式をフリーズし、解析関数の逆であるデパース関数がそのフリーズされたシンボルを文字列に戻すという私の直感的な理解

于 2018-01-30T07:57:03.457 に答える
7

印刷メソッドの場合、動作が異なる可能性があることに注意してください。

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 (just typing 'test' on the R command line)
test
#shows
#"structure(list(a = 1, b = 2), .Names = c(\"a\", \"b\"), class = \"foo\")"

私がフォーラムで見た他のコメントは、最後の行動が避けられないことを示唆しています。パッケージの印刷メソッドを作成している場合、これは残念なことです。

于 2013-10-02T20:24:02.540 に答える
0

Eli Holmesの答えを詳しく説明するには:

  1. myfunc美しく動作します
  2. 私はそれを別の関数内で呼び出したくなりました(彼の20年8月15日のコメントで説明されているように)
  3. 失敗
  4. (外部関数から呼び出されるのではなく)直接コーディングされた関数内でdeparse(substitute()は、このトリックはうまく機能します。
  5. これはすべて彼の答えに暗示されていますが、私の程度の忘却を覗き見するために、私はそれを詳しく説明したかったのです。
an_object <- mtcars
myfunc <- function(x) deparse(substitute(x))

myfunc(an_object)
#> [1] "an_object"

# called within another function 
wrapper <- function(x){
  myfunc(x)
}

wrapper(an_object)
#> [1] "x"
于 2021-10-18T23:19:48.423 に答える