Pecan: 基于原生 R 函数的“PEcAn.logger”

创建于 2018-02-28  ·  7评论  ·  资料来源: PecanProject/pecan

描述


掩码 R 在 $#$ PEcAn.logger $#$ 中的messagewarningstop函数如下:

message <- PEcAn.logger::logger.info
warning <- PEcAn.logger::logger.warn
stop <- PEcAn.logger::logger.severe

并且,开始用原生 R 函数替换所有出现的PEcAn.logger::logger.* 。 最终,我们可以将PEcAn.logger移动到Suggests

这意味着在会话中加载PEcAn.logger (使用library(PEcAn.logger) )将触发函数替换——否则,运行代码将默认为标准 R 消息传递函数。

语境




几个原因:

  • PEcAn.logger::logger.*很长而且打字很烦人。
  • PEcAn.logger为我们的每个软件包引入了另一种非 CRAN 依赖项,这使得它们在独立于 PEcAn 时使用起来更加烦人。
  • 当前的记录器功能不适用于testthatexpect_error等功能
  • 它们也不适用于suppressWarningssuppressMessages
  • 此更改不会影响调用messagewarningstop的其他包内的函数的行为,因为它们使用自己的内部包命名空间。

可能的实施


见上文(每个都必须是#' @export -ed。此外, PEcAn.logger中的grepl正则表达式需要调整以忽略warningmessagestop调用以保持信息丰富。

Enhancement Discussion 01 - Low Stale

最有用的评论

重命名太长:我倾向于导出删除多余logger.*部分的别名,例如PEcAn.logger::info() 。 除此之外的任何事情都会回到关于命名空间与library调用的争论。

使用expect_errorsuppressMessages之类的函数会很尴尬:这里最大的潜在区别是 PEcAn.logger 不使用 R 的正式条件信号机制,因此与任何函数一起使用都很尴尬预计condition 。 如果 PEcAn.logger可以修改为使用条件,我更愿意这样做,但我也不熟悉这里的历史—— @robkooper ,避免signalCondition是有意的设计选择/处理所必需的一些重定向案例?

所有7条评论

主要原因是一种轻松收集文件中消息的方法。 消息、警告和停止如何处理?

因此,如果加载了PEcAn.logger包,所有日志记录的工作方式与现在相同。 只是不再需要使用日志记录功能。 实际上,我的建议是:

# These call the default R functions
message("hello")
warning("whoops")
stop("whoah")

library(PEcAn.logger)
# By loading the logger package, the functions become masked so
message("hello")      # This actually calls `PEcAn.logger::logger.info
warning("whoops")   # This calls `PEcAn.logger::logger.warn
stop("error")      # This calls `PEcAn.logger::logger.severe

因此,用于设置记录器级别、输出文件等的所有相同功能都应该以相同的方式工作。

附带说明一下,基本 R 的messagewarningstop可以通过sink有选择地重定向。

重命名太长:我倾向于导出删除多余logger.*部分的别名,例如PEcAn.logger::info() 。 除此之外的任何事情都会回到关于命名空间与library调用的争论。

使用expect_errorsuppressMessages之类的函数会很尴尬:这里最大的潜在区别是 PEcAn.logger 不使用 R 的正式条件信号机制,因此与任何函数一起使用都很尴尬预计condition 。 如果 PEcAn.logger可以修改为使用条件,我更愿意这样做,但我也不熟悉这里的历史—— @robkooper ,避免signalCondition是有意的设计选择/处理所必需的一些重定向案例?

在考虑了更多之后,我同意我的方法没有意义,并且实际上不会起作用。 就个人而言,我可能更喜欢使用 R 的默认函数( stopwarningmessage ),必要时通过sink重定向它们,但我可以看到坚持使用PEcAn.logger的理由。 另一种可能性是切换到futile.logger ,这是之前建议的(#1362)。

同时,我喜欢@infotroph的两个建议——添加更短的别名和信号条件。

另一个有前途的想法是debugme包,它提供如下语法:

f <- function(a, b = 3) {
  c <- a + b
  d <- a * b
  e <- a ^ b
  "!DEBUG arguments are a = `a` and b = `b`"
  c(c, d, e)
}

此问题已过时,因为它已 365 天开放,没有任何活动。

另请参阅#1362 中的讨论

此页面是否有帮助?
0 / 5 - 0 等级