Я новичок в регистраторе пакетов R. Однако это выглядит очень полезно, и код, который мне приходится поддерживать, использует его. Следующий код подготавливает вход в консоль и запись в файл.
.start_logger = function(){
unloadNamespace('logger')
library('logger')
my_logfile <- tempfile()
### file
logger::log_threshold('DEBUG', index = 1)
logger::log_appender(appender_file(my_logfile), index = 1)
### console ----
log_threshold('INFO', index = 2)
logger::log_appender(appender_console, index = 2)
logger::log_with_separator("start calculation")
logger::log_tictoc('main', namespace = 'main')
log_separator()
return(my_logfile)
}
Я хочу вызвать эту функцию с помощью
my_logfile = .start_logger()
Я столкнулся с 2 интересными проблемами:
logger::log_with_separator("start calculation")Ошибка в силе (файл): объект «my_logfile» не найден
Если я запускаю код без функции, логирование работает:
unloadNamespace('logger')
library('logger')
my_logfile <- tempfile()
logger::log_threshold('DEBUG', index = 1)
logger::log_appender(appender_file(my_logfile), index = 1)
### console ----
log_threshold('INFO', index = 2)
logger::log_appender(appender_console, index = 2)
logger::log_with_separator("start calculation")
logger::log_tictoc('main', namespace = 'main')
log_separator()
Я предполагаю, что это как-то связано с пространствами имен или чем-то вроде того, что касается временного файла, который я использую для журналирования. Не могли бы вы подсказать мне, как заставить работать версию с вызовом функции?
Обновлено: Дальнейшие исследования показали мне, что присвоение переменной my_logfile глобальной среде решает проблему. Но как это сделать более элегантно/правильно?
Итак, замените
my_logfile <- tempfile()
с
my_logfile <<- tempfile()
.
Обновлено: Это оказалось ошибкой. Если вы столкнулись с этой ошибкой, вы можете либо воспользоваться предлагаемыми здесь решениями, либо надеяться, что ошибка исправлена в более новой версии пакета (https://github.com/daroczig/logger/issues/157).
сессионная информация() Версия R 4.1.2 (01.11.2021) Платформа: x86_64-w64-mingw32/x64 (64-разрядная версия) Работает под управлением: Windows Server x64 (сборка 14393).
Продукты матрицы: по умолчанию
локаль: [1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United Штаты.1252 [4] LC_NUMERIC=C
LC_TIME=English_United States.1252прикрепленные базовые пакеты: [1] статистика графика grDevices utils
база методов наборов данныхдругие прикрепленные пакеты: [1] logger_0.3.0
загружается через пространство имен (и не прикрепляется): [1] compiler_4.1.2 инструменты_4.1.2 клей_1.7.0





Вызов appender_file(my_logfile) использует немного нестандартные вычисления для ленивой оценки имен переменных. Вы можете обойти это, используя do.call для принудительной оценки этой временной переменной. Кажется, это работает
.start_logger = function(){
unloadNamespace('logger')
library('logger')
my_logfile <- tempfile()
### file
logger::log_threshold('DEBUG', index = 1)
logger::log_appender(do.call("appender_file", list(my_logfile)), index = 1)
### console ----
log_threshold('INFO', index = 2)
logger::log_appender(appender_console, index = 2)
logger::log_with_separator("start calculation")
logger::log_tictoc('main', namespace = 'main')
log_separator()
return(my_logfile)
}
Мне это кажется немного странным. Вы можете сообщить о поведении авторам пакетов, чтобы узнать их мнение: github.com/daroczig/logger/issues. Возможно, есть причина, по которой они делают это таким образом.
Я зарегистрировал проблему (github.com/daroczig/logger/issues/157), и похоже, это ошибка. Исправление было предоставлено. Однако в моем случае это не работает.
Спасибо, это действительно работает. Мое решение выше (установка имени файла в глобальной среде) также сработало. У тебя с do.call тоже работает. Мне просто интересно: почему это не работает без этих дополнительных настроек? Это ошибка? Знаете ли вы, как это предназначено в регистраторе? Спасибо!