سؤال

لدي وظيفة في R التي أتصل بها عدة مرات. أريد أن أتبع عدد المرات التي اتصلت بها واستخدامها لاتخاذ القرارات بشأن ما يجب القيام به داخل الوظيفة. إليك ما لدي الآن:

f = function( x ) {
   count <<- count + 1
   return( mean(x) )
}

count = 1
numbers = rnorm( n = 100, mean = 0, sd = 1 )
for ( x in seq(1,100) ) {
   mean = f( numbers )
   print( count )
}

لا أحب ذلك، يجب أن أعلن العد المتغير خارج نطاق الوظيفة. في C أو C ++، يمكنني فقط إجراء متغير ثابت. هل يمكنني القيام بشيء مماثل في لغة البرمجة R؟

هل كانت مفيدة؟

المحلول

فيما يلي طريقة واحدة باستخدام إغلاق (في إحساس لغة البرمجة)، أي تخزين متغير العد في بيئة مرفقة يمكن الوصول إليها فقط بواسطة وظيفتك:

make.f <- function() {
    count <- 0
    f <- function(x) {
        count <<- count + 1
        return( list(mean=mean(x), count=count) )
    }
    return( f )
}

f1 <- make.f()
result <- f1(1:10)
print(result$count, result$mean)
result <- f1(1:10)
print(result$count, result$mean)

f2 <- make.f()
result <- f2(1:10)
print(result$count, result$mean)
result <- f2(1:10)
print(result$count, result$mean)

نصائح أخرى

هنا هو نهج آخر. هذا واحد يتطلب أقل من الكتابة و (في رأيي) أكثر قابلية للقراءة:

f <- function(x) {
    y <- attr(f, "sum")
    if (is.null(y)) {
        y <- 0
    }
    y <- x + y
    attr(f, "sum") <<- y
    return(y)
}

هذا القصاص، وكذلك مثال أكثر تعقيدا للمفهوم يمكن العثور عليه في هذا المقالة R-ploggers

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top