Вопрос по r – Статические переменные в R

18

У меня есть функция в 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 )
}

Мне не нравится, что я должен объявить переменную count за пределами функции. В C или C ++ я мог бы просто сделать статическую переменную. Могу ли я сделать подобное на языке программирования

Ваш Ответ

2   ответа
5

е читабельным:

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

Этот фрагмент, а также более сложный пример концепции можно найти в этой статье R-Bloggers

Недостатком этого подхода является то, что вы фактически создаете копию f при каждом запуске. hadley
Не могли бы вы объяснить, почему? @ Hadley hshihab
@ hshihab Изменение атрибута объекта R (и функции также является объектом R) создает копию из-за поведения R. «Копировать при записи». Возможно,data.table::setattrункция @ была бы хорошей вещью здесь, поскольку она обновляет атрибуты по ссылке (не копируя весь объект) ... R Yoda
26

рования), т.е. сохранить переменную 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)
Идеальный ответ, это именно то, что я искал. :) James Thompson

Похожие вопросы