প্রতিশ্রুতি ইতিমধ্যে মূল্যায়ন অধীনে: পুনরাবৃত্তি ডিফল্ট যুক্তি রেফারেন্স বা আগের সমস্যাগুলি?


143

এই আমার আর কোড। ফাংশনগুলি হিসাবে সংজ্ঞায়িত করা হয়:

f <- function(x, T) {
  10 * sin(0.3 * x) * sin(1.3 * x ^ 2) + 0.001 * x ^ 3 + 0.2 * x + 80
}

g <- function(x, T, f=f) {
  exp(-f(x) / T)
}

test <- function(g=g, T=1) { 
  g(1, T)
}

চলমান ত্রুটিটি হ'ল:

> পরীক্ষা () পরীক্ষায়
ত্রুটি ():
ইতিমধ্যে মূল্যায়নের আওতায় প্রতিশ্রুতি: পুনরাবৃত্তি ডিফল্ট যুক্তি রেফারেন্স বা আগের সমস্যাগুলি?

আমি যদি এর fমধ্যে সংজ্ঞাটি স্থির করে রাখি gতবে ত্রুটিটি চলে যায়।

আমি ভাবছিলাম ত্রুটিটি কী ছিল? এটা কিভাবে সংশোধন করতে যদি সংজ্ঞার প্রতিস্থাপন না fযে এর মধ্যে g? ধন্যবাদ!


হালনাগাদ:

ধন্যবাদ! দুটি প্রশ্ন:

(1) যদি ফাংশন testআরও তর্ক করে f, আপনি কি এর মতো কিছু যুক্ত করবেন test <- function(g.=g, T=1, f..=f){ g.(1,T, f.=f..) }? আরও পুনরাবৃত্তি হওয়ার ক্ষেত্রে, এটি কি আরও ভাল যোগ করা ভাল এবং নিরাপদ অনুশীলন ?

(২) যদি fকোনও অ-কার্য-যুক্তি যুক্তি হয়, উদাহরণস্বরূপ g <- function(x, T, f=f){ exp(-f*x/T) }এবং test <- function(g.=g, T=1, f=f){ g.(1,T, f=f.) }, আনুষ্ঠানিক এবং প্রকৃত অ-কার্যকরী উভয় যুক্তির জন্য একই নাম ব্যবহার করা একটি ভাল এবং নিরাপদ অনুশীলন বা এটি কিছু সম্ভাব্য সমস্যার কারণ হতে পারে?

উত্তর:


159

ফর্মের আনুষ্ঠানিক যুক্তিগুলির x=xকারণ এটি। আমরা যে দুটি দৃষ্টান্তটি পাই সেগুলি মুছে ফেলা:

f <- function(x, T) {
   10 * sin(0.3 * x) * sin(1.3 * x^2) + 0.001 * x^3 + 0.2 * x + 80 
}

g <- function(x, T, f. = f) {  ## 1. note f.
   exp(-f.(x)/T) 
}

test<- function(g. = g, T = 1) {  ## 2. note g.
   g.(1,T) 
}

test()
## [1] 8.560335e-37

2
ধন্যবাদ! দুটি প্রশ্ন (1) যদি ফাংশন পরীক্ষা আরও f এর জন্য একটি আর্গুমেন্ট নেয় , আপনি কি পরীক্ষার মতো কিছু যুক্ত করবেন <- ফাংশন (g। = G, T = 1, f .. = f) {g। (1, টি, চ। = চ ..)} ? আরও পুনরাবৃত্তি হওয়ার ক্ষেত্রে, এটি কি আরও ভাল যোগ করা ভাল এবং নিরাপদ অনুশীলন ? (২) যদি f একটি অ-কার্যকারিতা যুক্তি হয়, উদাহরণস্বরূপ g <- ফাংশন (x, T, f = f) {এক্সপ্রেস (-ফ x / টি)} * এবং পরীক্ষা <- ফাংশন (g। = G, T = 1, এফ = এফ) {জি। (1, টি, এফ = এফ।)} , আনুষ্ঠানিক এবং প্রকৃত অ-কার্যকরী উভয় যুক্তির জন্য একই নাম ব্যবহার করা ভাল এবং নিরাপদ অনুশীলন বা এটি কিছুটা সম্ভাব্য সমস্যার কারণ হতে পারে?
টিম

16
অন্য কোন সমাধান? আমি ফাংশনগুলির শৃঙ্খলার (প্রায় 5 স্তর) বেশ গভীরভাবে কিছু যুক্তি দিয়ে যাচ্ছি, এবং এই সমাধানটি হয়ে উঠতে পারে .....cumbersome। :)
রোমান Luštrik

2
@ রোমানলুটারিক যদি আপনি যুক্তিগুলি নীচে দিয়ে যাচ্ছেন এবং সেগুলির কয়েকটিটি আপনি নিরাপদে উপেক্ষা করতে পারেন ...তবে ফাংশন শৃঙ্খলে আর্গুমেন্টগুলি পাস করার জন্য উপবৃত্তাকার বা একটি তালিকা ব্যবহার করে দেখুন । এটি সমস্ত কিছু পূর্বনির্ধারিত করার চেয়ে অনেক বেশি নমনীয় (ভাল এবং অসুস্থের জন্য)। উপবৃত্তিতে আপনার মূল যুক্তিগুলি (বা তালিকা) বুদ্ধিমানের তা নিশ্চিত করার জন্য আপনাকে কিছু পরীক্ষা করতে হবে।
রাসেলপিয়ের্স

2
যেমন - এখানে আরেকটি বিকল্প স্পষ্টভাবে, একটি পিতা বা মাতা ফ্রেমে আর্গুমেন্ট এটি প্রচেষ্টা আপতিক সক্রিয় প্রতিশ্রুতি অত্যাচার বাইপাস হয় get("f", envir = parent.frame())
কেভিন উশে

1
কেবলমাত্র প্রয়োজনীয়তা হ'ল আপনি বাম এবং ডানদিকে একই নামটি ব্যবহার করবেন না। তা ছাড়া এটি কেবল স্টাইল।
জি গ্রোথেনডিক

13

আপনি যদি যুক্তির মূল্যায়ন প্রসঙ্গে স্পেসিফাই করেন তবে আপনি একই নামের সমস্যা এড়াতে পারেন:

f <- function(x) {
  10 * sin(0.3 * x) * sin(1.3 * x ^ 2) + 0.001 * x ^ 3 + 0.2 * x + 80
}
g <- function(x, t=1, f=parent.frame()$f) {
  exp(-f(x) / t)
}
test <- function(g=parent.frame()$g, t=1) { 
  g(1,t)
}
test()
[1] 8.560335e-37

2
এটি একটি ভাল উপায়, আমি মনে করি নির্দিষ্ট পরিবেশটি আরও পরিষ্কার clear
cloudscomputes

1

আমি জি। গ্রোথেন্ডিক উত্তরটি পছন্দ করি তবে আমি ভাবছিলাম যে ফাংশনের পরামিতিগুলিতে ফাংশনের নাম অন্তর্ভুক্ত না করা আপনার ক্ষেত্রে এটি আরও সহজ:

f <- function(x, T) {
  10 * sin(0.3 * x) * sin(1.3 * x^2) + 0.001 * x^3 + 0.2 * x + 80 
}
g <- function(x, T) {
  exp(-f(x)/T) 
}
test<- function(T = 1) {
  g(1,T)
}
test()
## [1] 8.560335e-37

1

ইতিমধ্যে উল্লিখিত হিসাবে, সমস্যাটি নিজের হিসাবে সংজ্ঞায়িত কোনও ফাংশন আর্গুমেন্ট থেকে আসে। যাইহোক, আমি কেন এটি একটি সমস্যা তার একটি ব্যাখ্যা যুক্ত করতে চাই কারণ বোঝার ফলে সমস্যাটি এড়াতে সহজতর (আমার জন্য) উপায় নিয়ে গেছে: সংজ্ঞার পরিবর্তে কলটিতে যুক্তিটি নির্দিষ্ট করুন।

এটা কাজ করে না:

x = 4
my.function <- function(x = x){} 
my.function() # recursive error!

তবে এটি কাজ করে:

x = 4
my.function <- function(x){} 
my.function(x = x) # works fine!

তাদের নিজস্ব পরিবেশে ফাংশন যুক্তি উপস্থিত রয়েছে।

আর প্রথমে স্থানীয় পরিবেশে, তারপরে বৈশ্বিক পরিবেশে পরিবর্তনশীল সন্ধান করে। এটি ঠিক ঠিক একইভাবে কীভাবে কোনও ফাংশনের অভ্যন্তরে বৈকল্পিকের বৈশ্বিক পরিবেশে একটি চলকের মতো একই নাম থাকতে পারে এবং আর স্থানীয় সংজ্ঞাটি ব্যবহার করবে।

ফাংশন আর্গুমেন্ট সংজ্ঞাগুলি তাদের নিজস্ব স্থানীয় পরিবেশ গঠনের কারণ হ'ল আপনি যেমন অন্যান্য আর্গুমেন্ট মানের উপর ভিত্তি করে ডিফল্ট আর্গুমেন্ট মান থাকতে পারেন

my.function <- function(x, two.x = 2 * x){}

সুতরাং আপনি কেন একটি ফাংশন সংজ্ঞায়িত করতে পারবেন না my.function <- function(x = x){}তবে আপনি ব্যবহার করে ফাংশনটি কল করতে পারেন my.function(x = x)। আপনি যখন ফাংশনটি সংজ্ঞায়িত করেন তখন আর বিভ্রান্ত হয়ে পড়ে কারণ এটি আর্গুমেন্টটির x =স্থানীয় মান হিসাবে খুঁজে পায় xতবে আপনি যখন ফাংশনটি কল করেন তখন আর খুঁজে পায়x = 4 তখন স্থানীয় পরিবেশে আপনি যে ফোনটি ডাকছেন তা সন্ধান করে।

সুতরাং যুক্তির নাম পরিবর্তন করে বা অন্য উত্তরে উল্লিখিত হিসাবে পরিবেশটি স্পষ্টভাবে নির্দিষ্ট করে ত্রুটি সংশোধন করা ছাড়াও আপনি কেবল এটি নির্দিষ্ট করতে পারেন x=xযখন আপনি যখন ফাংশনটি কল করবেন তখন এটি সংজ্ঞায়িত করার পরিবর্তে। আমার জন্য, x=xকলটিতে সুনির্দিষ্ট সমাধানের বিষয়টি উল্লেখ করা যেহেতু এতে অতিরিক্ত সিনট্যাক্স বা আরও বেশি পরিবর্তনশীল নাম জড়িত না।

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