সেই ফাংশনের মধ্যে ফাংশনের নাম নির্ধারণ করুন


14

আমি সেই অজ্ঞাতনামা ফাংশনটির মধ্যে কীভাবে ফাংশনটির নাম পেতে পারি? নীচে আমি ধরে নিলাম এই ডাকা করার magical_r_function()এবং প্রত্যাশিত ফলাফলগুলি কী হবে তা করার কোনও ফাংশন বা প্রক্রিয়া রয়েছে ।

my_fun <- function(){
      magical_r_function()
}
my_fun()
## [1] "my_fun"


foo_bar <- function(){
      magical_r_function()
}
foo_bar()
## [1] "foo_bar"

ballyhoo <- function(){
    foo_bar()
}
ballyhoo()
## [1] "foo_bar"

tom_foolery <- foo_bar
tom_foolery()
## [1] "tom_foolery"

উত্তর:


17
as.character(match.call()[[1]])

ডেমো:

my_fun <- function(){
  as.character(match.call()[[1]])
}
my_fun()
# [1] "my_fun"
foo_bar <- function(){
  as.character(match.call()[[1]])
}
foo_bar()
# [1] "foo_bar"
ballyhoo <- function(){
  foo_bar()
}
ballyhoo()
# [1] "foo_bar"
tom_foolery <- foo_bar
tom_foolery()
# [1] "tom_foolery"

টাইলার, আমি অবশ্যই কিছু মনে করি না (এবং জিজিও ভাল,) তবে কোন উত্তরটি বেছে নেওয়ার জন্য আপনার মানদণ্ডটি কী ছিল?
r2evans

ভাল প্রশ্ন. উভয়ই দুর্দান্ত পছন্দ। উভয়ই আমার পরীক্ষাগুলিতে একই রকম কাজ করেছে বলে মনে হয়েছিল। জিজি আরও কিছু বিশদ সরবরাহ করেছে। সিদ্ধান্ত নেওয়া শক্ত ছিল।
টাইলার রিঙ্কার

কাছাকাছি পরিদর্শন করার পরে কোনও নতুন নামকে কোনও ফাংশন নির্ধারণের শেষ শর্তটি, এটি আরও একবারের সাথে মূল জিজ্ঞাসার সাথে একত্রিত হয়।
টাইলার রিঙ্কার

আমার মন্তব্য সম্পূর্ণরূপে পরিবর্তন করবেন না দয়া করে! আমি হুড়োহুড়ি করে সংবাদপত্রের প্রয়োজন নেই (যদিও আপনার চেয়ে আমার কিছুটা বেশি আছে)। না, আমি কৌতূহলী ছিলাম। আমি উভয়ই মনে করি match.callএবং sys.call"প্রভাব" এবং "প্রয়োজনীয়তা" এর সামান্য পার্থক্য সহ বৈধ বেস ফাংশন। সুতরাং আমি অন্তর্দৃষ্টি সম্পর্কে জানতে আগ্রহী আপনি অন্য এক চেয়ে পছন্দ করতে পারে।
r2evans

11

sys.call(0)যদি কোনও কল অবজেক্ট আউটপুট ঠিক থাকে বা আলাদা হয় তবে চেষ্টা করুন যে আপনি যদি কেবল একটি অক্ষরের স্ট্রিং হিসাবে নামটি চান want নীচে এটির কয়েকটি পরীক্ষা করা হল। sys.call নাম এবং যুক্তি উভয়ই প্রদান করে এবং [[1]] কেবলমাত্র নামটি খুঁজে বের করে।

my_fun <- function() deparse(sys.call(0)[[1]])

g <- function() my_fun()

my_fun()
## [1] "my_fun"

g()
## [1] "my_fun"

ফাংশন নাম

নোট করুন যে ফাংশনগুলির আসলে নাম নেই। আমরা ফাংশনটির নাম হিসাবে যা বিবেচনা করি তা হ'ল কেবলমাত্র ভেরিয়েবল যা ফাংশনটি ধারণ করে এবং নিজেই ফাংশনের অংশ নয়। একটি ফাংশন আর্গুমেন্ট, শরীর এবং পরিবেশ নিয়ে গঠিত - এই উপাদানগুলির মধ্যে কোনও ফাংশনের নাম নেই।

নামবিহীন ফাংশন

তবুও কারও একটি বেনামী ফাংশন থাকতে পারে এবং উপরের সাথে ব্যবহার করার পরে এগুলি আজব ফলাফলগুলি দিতে পারে।

sapply(1:3, function(x) deparse(sys.call(0)[[1]]))
## [1] "FUN" "FUN" "FUN"

এজ মামলা

কিছু পরিস্থিতি রয়েছে, বিশেষত deparseবেনাম ফাংশনগুলির সাথে জড়িত, যেখানে একাধিক উপাদান ফিরে আসবে তাই আপনি যদি এই ধরণের কেসগুলি কভার করতে চান তবে nlines = 1 যুক্তিটি ডিপার্স করতে বা ডিপার্স (...) [[1]] বা হিসাবে ব্যবহার করতে পারেন @ কনরাড রুডলফ দ্বারা উল্লিখিত @ 4.0.0.0 এ Deparse1 ব্যবহার করে।

Map(function(x) deparse(sys.call(0)[[1]], nlines = 1), 1:2)
## [[1]]
## [1] "function (x) "
## 
## [[2]]
## [1] "function (x) "

Map(function(x) deparse(sys.call(0)[[1]]), 1:2)  # without nlines=1
## [[1]]
## [1] "function (x) "             "deparse(sys.call(0)[[1]])"
##
## [[2]]
## [1] "function (x) "             "deparse(sys.call(0)[[1]])"

অন্যান্য

প্রত্যাহার । যদি আপনি ফাংশনটির নামটি চান তা যদি পুনরাবৃত্তভাবে ফাংশনটি কল করতে হয় তবে তার Recall()পরিবর্তে ব্যবহার করুন। সহায়তা ফাইল থেকে:

fib <- function(n)
   if(n<=2) { if(n>=0) 1 else 0 } else Recall(n-1) + Recall(n-2)
fib(4)
## [1] 3

সতর্কতা এবং বন্ধ করুন এই উভয়ই ফাংশনের নামটি সহ যে কোনও যুক্তিই তাদের কাছে দেওয়া হয়েছে তাই বর্তমান ফাংশনটির নাম পাওয়ার দরকার নেই।

testWarning <- function() warning("X")
testWarning()
## Warning message:
## In testWarning() : X

2
আপনার "এজ কেস" deparse1ফাংশনটির প্রবর্তনের মাধ্যমে আর 4.0 তে মার্জিতভাবে সমাধান করা হয়েছে । আমি অনুমান করছি যে আমাদের ডিফল্টর পরিবর্তে এটি ব্যবহার শুরু করা উচিত deparse, একবার গ্রহণের পরিমাণ পর্যাপ্ত।
কনরাড রুডল্ফ

+1 এর জন্য Recall, যা আমি অনুভব করি যা ওপি সত্যই প্রয়োজন ছিল। যাইহোক, আপনার ফিবোনাচি ক্রম উদাহরণটি আসলে খুব ভাল নয়: এটিতে আপনার সমস্যাগুলি প্রায়শই কলগুলি পুনরাবৃত্তি করে: কারণ fib(10), fib(8)মোট 2 বার বলা হয় (একবার fib(10)সরাসরি, একবারে fib(9)), fib(7)3 বার fib(6)বলা হয়, বলা হয় 5 বার. এই কোথায় যাচ্ছে দেখুন?
এমিল বোদে

@ এমিল, এটি পুনরুদ্ধার সহায়তা পৃষ্ঠা থেকে ঠিক আছে (উত্তরে বলা আছে) সুতরাং এটি অবশ্যই বিষয়টি ব্যাখ্যা করে। আপনি যদি অন্য কারণে এটি পছন্দ না করেন তবে আপনি আর বিকাশকারীদের কাছে অভিযোগ করতে পারেন।
জি গ্রোথেনডিক

5

আমরাও ব্যবহার করতে পারি

my_fun <- function(){
  as.character(as.list(sys.calls()[[1]])[[1]])
 }

my_fun()
#[1] "my_fun"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.