الخطأ الذي تواجهه يحدث بسبب دورة متكررة غير متوقعة في تقييم الدالة. تظهر هذه المشكلة في الوظيفة evaluate
التي تقوم بتقييم الدوال المعرفة مسبقًا مثل sum
، median
، و floor
على البيانات المعطاة.
السبب الرئيسي لحدوث هذه المشكلة هو أن الدوال التي تقوم بتقييمها تحتوي على نفسها داخل جسمها. على سبيل المثال، في الوظيفة sum
، تقوم بالاستدعاء النفسي sum(data)
، ونفس الأمر يحدث في الوظائف الأخرى.
-
فارق خيار drop وحذف commit في Git12/02/2024
-
Angular2 Two-Way Binding Basics29/03/2024
لحل هذه المشكلة، يجب تغيير أسماء الدوال داخل الدوال الأصلية، أو استخدام أسماء مختلفة للدوال في الدوال الأصلية. على سبيل المثال، يمكن تعديل الكود كما يلي:
Rsum_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”. لحل هذه المشكلة، يمكنك تعديل الشفرة على النحو التالي:
Rmy_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
على التوالي. وبالتالي، لن يحدث استدعاء نفسي داخل جسم الدوال، ويجب أن يعمل الكود كما هو متوقع.