У меня есть функция счетчика, которую я люблю оборачивать вокруг другой функции («забавы»), чтобы отслеживать, сколько раз я ее вызывал.Я отслеживаю вызовы, создавая новую среду "counter.env", если она еще не существует, и сохраняя счетчик там.
counter <- function(fun) {
if (!exists("counter.env", envir = .GlobalEnv)) {
counter.env <<- new.env(parent = globalenv())
assign("i", 0, envir = counter.env)
}
function(...) {
local(i <- i+1, env = counter.env)
fun(...)
}
}
Также у меня есть функция "get_calls", которая простопозвоните, чтобы получить счет из окружающей среды.Я хотел бы, чтобы он запускал 0 в случае, если пользователь вызывает его до фактической функции, которую он вызывает, по любой причине, по которой он это сделает.
get_calls <- function() {
if (!exists("counter.env", envir = .GlobalEnv)) {
counter.env <<- new.env(parent = .GlobalEnv)
assign("i", 0, envir = counter.env)
}
get("i", envir = counter.env)
}
Наконец, давайте скажем, что функция яwrapping - это функция с собственным аргументом "fun (arg1)".Так что я заверну это.
count.and.call <- counter(fun)
И я называю это так:
count.and.call(arg1)
Сразу же создается "counter.env" в моей глобальной среде, и я могу вернуть вызов с помощью get_calls.
Теперь барабанная дробь Когда я помещаю эти функции в пакет, собираю пакет и запускаю
count.and.call(arg1)
, counter.env не создается в глобальном env.и это показывает
error in eval(quote(i <- i + 1), counter.env) :
object 'counter.env' not found
Моя непосредственная задача состоит в том, чтобы починить мой счетчик, что, вероятно, связано с определением объема среды.
Однако я также не уверен, использовал ли я лучшеепрактики для моей контр-функции, если да, могу ли я получить совет?