Benim için işe yarayan katastrofik olmayan hataları işlemek için global R seçeneğini belirtmek ve hatayla ilgili bilgileri saklamak ve hatadan sonra bu bilgileri incelemek için özelleştirilmiş bir iş akışı. Şu anda R 3.4.1 sürümünü çalıştırıyorum. Aşağıda, benim için çalışan iş akışının bir açıklamasının yanı sıra R'de genel hata işleme seçeneğini ayarlamak için kullandığım bazı kodları ekledim.
Yapılandırdığım gibi, hata işleme ayrıca hata anında çalışma belleğindeki tüm nesneleri içeren bir RData dosyası oluşturur. Bu döküm, kullanılarak R'ye geri okunabilir load()ve ardından, hata anında var olan çeşitli ortamlar kullanılarak etkileşimli olarak incelenebilir debugger(errorDump).
traceback()Yığın içindeki herhangi bir özel işlevden çıktıdaki satır numaralarını alabildiğimi , ancak yalnızca komut dizimde kullanılan herhangi bir özel işlevi keep.source=TRUEararken seçeneği source()kullandığımı not edeceğim. Bu seçenek olmadan, genel hata işleme seçeneğini aşağıdaki gibi ayarlamak, tam çıktısını traceback()adlı bir hata günlüğüne gönderdi error.log, ancak satır numaraları mevcut değildi.
İşte iş akışımda attığım genel adımlar ve etkileşimli olmayan bir R arızasından sonra bellek dökümü ve hata günlüğüne nasıl erişebildiğim.
Komut satırından çağırdığım ana betiğin üstüne şunu koydum. Bu, R oturumu için genel hata işleme seçeneğini belirler. Ana senaryom çağrıldı myMainScript.R. Koddaki çeşitli satırlarda, yaptıkları şeyi açıklayan yorumlar vardır. Temel olarak, bu seçenekle, R tetikleyen bir hatayla karşılaştığında stop(), dizindeki tüm etkin ortamlarda çalışan belleğin RData (* .rda) döküm dosyasını oluşturur ~/myUsername/directoryForDumpve ayrıca error.logbazı yararlı bilgilerle adlandırılmış bir hata günlüğü de aynı dizin. Hata durumunda başka işlemler eklemek için bu parçacığı değiştirebilirsiniz (örneğin, döküm dosyasına bir zaman damgası ve hata günlüğü dosya adları vb. Ekleyin).
options(error = quote({
setwd('~/myUsername/directoryForDump'); # Set working directory where you want the dump to go, since dump.frames() doesn't seem to accept absolute file paths.
dump.frames("errorDump", to.file=TRUE, include.GlobalEnv=TRUE); # First dump to file; this dump is not accessible by the R session.
sink(file="error.log"); # Specify sink file to redirect all output.
dump.frames(); # Dump again to be able to retrieve error message and write to error log; this dump is accessible by the R session since not dumped to file.
cat(attr(last.dump,"error.message")); # Print error message to file, along with simplified stack trace.
cat('\nTraceback:');
cat('\n');
traceback(2); # Print full traceback of function calls with all parameters. The 2 passed to traceback omits the outermost two function calls.
sink();
q()}))
Ana komut dosyasından ve sonraki herhangi bir işlev çağrısından, bir işlev her kaynak alındığında, seçeneğin keep.source=TRUEkullanıldığından emin olun. Yani, bir işlevi kaynaklamak için kullanırsınız source('~/path/to/myFunction.R', keep.source=TRUE). Bu, traceback()çıktının satır numaralarını içermesi için gereklidir . Görünüşe göre bu seçeneği dünya çapında kullanarak da ayarlayabilirsiniz options( keep.source=TRUE ), ancak çalışıp çalışmadığını görmek için bunu test etmedim. Satır numaralarına ihtiyacınız yoksa, bu seçeneği atlayabilirsiniz.
- Terminalden (R dışında), kullanarak toplu iş modunda ana komut dosyasını çağırın
Rscript myMainScript.R. Bu, etkileşimli olmayan yeni bir R oturumu başlatır ve komut dosyasını çalıştırır myMainScript.R. 1. adımda verilen kod parçacığı myMainScript.Retkileşimli olmayan R oturumu için hata işleme seçeneğini ayarlar.
- Uygulamasında bir yerde bir hatayla karşılaşın
myMainScript.R. Bu, ana komut dosyasının kendisinde olabilir veya birkaç işlevi derinlemesine iç içe geçirebilir. Hata ile karşılaşıldığında, işlem 1. adımda belirtildiği gibi gerçekleştirilecek ve R oturumu sona erecektir.
- Genel hata işleme seçeneği ayarında tarafından belirtilen dizinde, adlı bir RData döküm dosyası
errorDump.rdave adı ve hata günlüğü error.logoluşturulur '~/myUsername/directoryForDump'.
Boş zamanlarınızda, error.loghata mesajının kendisi ve hataya yol açan tam yığın izleme dahil olmak üzere hatayla ilgili bilgileri gözden geçirmek için inceleyin . Hata oluştuğunda oluşturulan günlüğün bir örneğini burada bulabilirsiniz; #karakterden sonraki sayıların, çağrı yığınındaki çeşitli noktalardaki hatanın satır numaraları olduğuna dikkat edin:
Error in callNonExistFunc() : could not find function "callNonExistFunc"
Calls: test_multi_commodity_flow_cmd -> getExtendedConfigDF -> extendConfigDF
Traceback:
3: extendConfigDF(info_df, data_dir = user_dir, dlevel = dlevel) at test_multi_commodity_flow.R#304
2: getExtendedConfigDF(config_file_path, out_dir, dlevel) at test_multi_commodity_flow.R#352
1: test_multi_commodity_flow_cmd(config_file_path = config_file_path,
spot_file_path = spot_file_path, forward_file_path = forward_file_path,
data_dir = "../", user_dir = "Output", sim_type = "spot",
sim_scheme = "shape", sim_gran = "hourly", sim_adjust = "raw",
nsim = 5, start_date = "2017-07-01", end_date = "2017-12-31",
compute_averages = opt$compute_averages, compute_shapes = opt$compute_shapes,
overwrite = opt$overwrite, nmonths = opt$nmonths, forward_regime = opt$fregime,
ltfv_ratio = opt$ltfv_ratio, method = opt$method, dlevel = 0)
Boş zamanlarınızda, errorDump.rdakullanarak etkileşimli bir R oturumuna yükleyebilirsiniz load('~/path/to/errorDump.rda'). Yüklendikten sonra, debugger(errorDump)herhangi bir aktif ortamdaki bellekteki tüm R nesnelerine göz atmak için çağrı yapın. Daha debugger()fazla bilgi için R yardımına bakın .
Bu iş akışı, komut satırında başlatılan etkileşimli olmayan R oturumlarının olduğu ve beklenmeyen hatalarla ilgili bilgilerin saklanmasını istediğiniz bazı üretim ortamında R çalıştırırken son derece yararlıdır. Arama yığınındaki hatanın satır numaralarına sahip olmanın yanı sıra, hata anında çalışma belleğini incelemek için kullanabileceğiniz bir dosyaya bellek boşaltma yeteneği, hataya neyin neden olduğu konusunda hızlı ölüm sonrası hata ayıklamayı kolaylaştırır.