البرمجة

حل مشكلة تكرار تقييم الدوال في R

الخطأ الذي تواجهه يحدث بسبب دورة متكررة غير متوقعة في تقييم الدالة. تظهر هذه المشكلة في الوظيفة evaluate التي تقوم بتقييم الدوال المعرفة مسبقًا مثل sum، median، و floor على البيانات المعطاة.

السبب الرئيسي لحدوث هذه المشكلة هو أن الدوال التي تقوم بتقييمها تحتوي على نفسها داخل جسمها. على سبيل المثال، في الوظيفة sum، تقوم بالاستدعاء النفسي sum(data)، ونفس الأمر يحدث في الوظائف الأخرى.

لحل هذه المشكلة، يجب تغيير أسماء الدوال داخل الدوال الأصلية، أو استخدام أسماء مختلفة للدوال في الدوال الأصلية. على سبيل المثال، يمكن تعديل الكود كما يلي:

R
sum_func <- function(data){ sum(data) } median_func <- function(data){ median(data) } floor_func <- function(data){ floor(data) } evaluate <- function(func, dat){ func(dat) } evaluate(sum_func, c(2, 4, 6)) evaluate(median_func, c(7, 40, 9)) evaluate(floor_func, 11.1)

باستخدام أسماء مختلفة للدوال في الدوال الأصلية، يجب أن يتم تجنب حدوث الدورات المتكررة غير المتوقعة، ويجب أن تعمل الأمور كما هو متوقع.

المزيد من المعلومات

يبدو أن المشكلة في الشفرة الحالية هي أن الدوال sum، median، و floor تقوم بالاستدعاء النفسي داخل جسمها، مما يؤدي إلى دورة متكررة غير متوقعة وبالتالي تسبب في حدوث خطأ “evaluation nested too deeply: infinite recursion”. لحل هذه المشكلة، يمكنك تعديل الشفرة على النحو التالي:

R
my_sum <- function(data){ base::sum(data) } my_median <- function(data){ stats::median(data) } my_floor <- function(data){ base::floor(data) } evaluate <- function(func, dat){ func(dat) } evaluate(my_sum, c(2, 4, 6)) evaluate(my_median, c(7, 40, 9)) evaluate(my_floor, 11.1)

في هذا التعديل، تم تغيير أسماء الدوال المعرفة مسبقًا sum، median، و floor إلى my_sum، my_median، و my_floor على التوالي. وبالتالي، لن يحدث استدعاء نفسي داخل جسم الدوال، ويجب أن يعمل الكود كما هو متوقع.

زر الذهاب إلى الأعلى