Запись в файл завершается сбоем в средстве журнала пакетов R, если вызывается изнутри функции

Я новичок в регистраторе пакетов 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 интересными проблемами:

  1. Если я запускаю код в новом сеансе вне функции, то файл, в который я хочу войти, не может быть найден. Если я запускаю код внутри функции, я получаю следующую ошибку при вызове 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()
  1. Если я один раз успешно запустил код вне функции, то также работает версия с запуском регистратора внутри функции.

Я предполагаю, что это как-то связано с пространствами имен или чем-то вроде того, что касается временного файла, который я использую для журналирования. Не могли бы вы подсказать мне, как заставить работать версию с вызовом функции?

Обновлено: Дальнейшие исследования показали мне, что присвоение переменной 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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вызов 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)
}

Спасибо, это действительно работает. Мое решение выше (установка имени файла в глобальной среде) также сработало. У тебя с do.call тоже работает. Мне просто интересно: почему это не работает без этих дополнительных настроек? Это ошибка? Знаете ли вы, как это предназначено в регистраторе? Спасибо!

Richi W 15.06.2024 10:17

Мне это кажется немного странным. Вы можете сообщить о поведении авторам пакетов, чтобы узнать их мнение: github.com/daroczig/logger/issues. Возможно, есть причина, по которой они делают это таким образом.

MrFlick 17.06.2024 16:19

Я зарегистрировал проблему (github.com/daroczig/logger/issues/157), и похоже, это ошибка. Исправление было предоставлено. Однако в моем случае это не работает.

Richi W 18.06.2024 10:32

Другие вопросы по теме