وظائف Mask R message
و warning
و stop
في PEcAn.logger
على النحو التالي:
message <- PEcAn.logger::logger.info
warning <- PEcAn.logger::logger.warn
stop <- PEcAn.logger::logger.severe
وابدأ في استبدال كل تكرارات PEcAn.logger::logger.*
بوظائف R الأصلية. في النهاية ، يمكننا نقل 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. أيضًا ، يجب تعديل التعبير العادي grepl
في PEcAn.logger
لتجاهل 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
اختيار تصميم مقصود / ضروري للتعامل بعض حالات إعادة التوجيه؟