Статические переменные в R
-
23-08-2019 - |
Вопрос
У меня есть функция в 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?
Решение
Вот один из способов использования замыкания (в смысле языка программирования), т.е.сохраните переменную count во внешней среде, доступной только вашей функции:
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-Bloggers