掩码 R 在 $#$ PEcAn.logger
$#$ 中的message
、 warning
和stop
函数如下:
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 时使用起来更加烦人。testthat
的expect_error
等功能suppressWarnings
或suppressMessages
message
、 warning
或stop
的其他包内的函数的行为,因为它们使用自己的内部包命名空间。
见上文(每个都必须是#' @export
-ed。此外, PEcAn.logger
中的grepl
正则表达式需要调整以忽略warning
、 message
和stop
调用以保持信息丰富。
主要原因是一种轻松收集文件中消息的方法。 消息、警告和停止如何处理?
因此,如果加载了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 的message
、 warning
和stop
可以通过sink
有选择地重定向。
重命名太长:我倾向于导出删除多余logger.*
部分的别名,例如PEcAn.logger::info()
。 除此之外的任何事情都会回到关于命名空间与library
调用的争论。
使用expect_error
或suppressMessages
之类的函数会很尴尬:这里最大的潜在区别是 PEcAn.logger 不使用 R 的正式条件信号机制,因此与任何函数一起使用都很尴尬预计condition
。 如果 PEcAn.logger可以修改为使用条件,我更愿意这样做,但我也不熟悉这里的历史—— @robkooper ,避免signalCondition
是有意的设计选择/处理所必需的一些重定向案例?
在考虑了更多之后,我同意我的方法没有意义,并且实际上不会起作用。 就个人而言,我可能更喜欢使用 R 的默认函数( stop
、 warning
、 message
),必要时通过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 中的讨论
最有用的评论
重命名太长:我倾向于导出删除多余
logger.*
部分的别名,例如PEcAn.logger::info()
。 除此之外的任何事情都会回到关于命名空间与library
调用的争论。使用
expect_error
或suppressMessages
之类的函数会很尴尬:这里最大的潜在区别是 PEcAn.logger 不使用 R 的正式条件信号机制,因此与任何函数一起使用都很尴尬预计condition
。 如果 PEcAn.logger可以修改为使用条件,我更愿意这样做,但我也不熟悉这里的历史—— @robkooper ,避免signalCondition
是有意的设计选择/处理所必需的一些重定向案例?