আর-তে, কোনও ফাংশনে প্রেরণের পরে কোনও বস্তুর নাম কীভাবে পাওয়া যায়?


135

আমি বিপরীত খুঁজছি 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")

35
আমার মনে deparse(substitute(...))হয় আপনি পরে
চেজ

2
"Z" নামে পরিচিত ভেরিয়েবল এবং টেস্টের জন্য প্যারামিটারটিকে "জেড" বলা হলেও খারাপ উদাহরণ ... "জেড" মুদ্রণ করা আপনাকে সত্যিই এটি বলে না যে আপনি যদি সঠিকভাবে এটি করেছিলেন তবে ;-)
টমি

@ টমি, এটি উন্নত করার চেষ্টা করেছেন, তবে আপনি যদি চান তবে সম্পাদনা করে উন্নত করুন।
এটিয়েন লো-ডেকারি

বিপরীত getআর হয় assignকিন্তু আমি নিশ্চিত যে এর আপনি কি সত্যিই জন্য ... খুঁজছেন নই
টম কেলি

উত্তর:


160

পুরাতন Deparse- বিকল্প কৌশল:

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

সম্পাদনা করুন: নতুন পরীক্ষা-বস্তুর সাথে এটি চালান Ran

দ্রষ্টব্য: তালিকার আইটেমগুলির একটি সেট প্রথম আর্গুমেন্ট থেকে পাস করার পরে এটি কোনও স্থানীয় ক্রিয়াকলাপের মধ্যে সফল হবে না lapply(এবং কোনও বস্তু একটি- forলুপকে দেওয়া তালিকা থেকে পাস করা হলে এটি ব্যর্থ হয় )) আপনি এটিটি বের করতে সক্ষম হবেন ".নাম" -ট্রিবিউট এবং কাঠামোর ফলাফল থেকে প্রসেসিংয়ের ক্রম, যদি এটির নামকরণ করা ভেক্টর প্রক্রিয়াধীন ছিল।

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

11
deparse(quote(var))

আমার স্বজ্ঞাত বোঝাপড়ায় যা মূল্যায়ন থেকে মূল্য বা বর্ণকে হিমায়িত করে এবং পার্স ফাংশনটির বিপরীত যা বিচ্ছিন্ন ফাংশন সেই স্ট্রিংকে প্রতীককে ফিরিয়ে দেয় free


6

নোট করুন যে মুদ্রণ পদ্ধতির জন্য আচরণটি আলাদা হতে পারে।

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

ফোরামগুলিতে আমি অন্যান্য মন্তব্যগুলি দেখেছি যে শেষ আচরণটি অনিবার্য। আপনি প্যাকেজগুলির জন্য মুদ্রণ পদ্ধতি লিখতে থাকলে এটি দুর্ভাগ্যজনক।


সম্ভবত এটি হওয়া উচিত: print.foo=function(x){ cat(deparse(substitute(x))) }বাprint.foo=function(x){ print(deparse(substitute(x)), quote=FALSE) }
আইআরটিএফএম

1
বাprint.foo=function(x){ print.default(as.list(x)) }
আইআরটিএফএম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.