1. ホーム
  2. r

[解決済み] Rで、オブジェクトが関数に送られた後、そのオブジェクトの名前を取得する方法は?

2022-04-25 21:58:32

質問

の逆をさがしています。 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")

解決方法は?

古くからあるデパース-サブスティテュートのトリックです。

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

Edit: 新しいテストオブジェクトで実行してみました。

注:ローカル関数内で、リストアイテムのセットが第一引数から lapply (に与えられたリストからオブジェクトが渡された場合も失敗します)。 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]]"