根据错误选择函数中的命令顺序[R]

ljo96ir5  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(119)

bounty将在3天后过期。回答此问题可获得+50声望奖励。LDT正在寻找标准答案

我在一个文件夹中有三个文件,名称如下:
第一个
当我使用TidyMultiqc package打开文件时,文件中现有的NA值可能会导致以下错误:

files <- dir(path,pattern = "*.json")        #locate files
files %>% 
  map(~ load_multiqc(file.path(path, .)))    #parse them

## the error
Error in parse_con(txt, bigint_as_char) : 
  lexical error: invalid char in json text.
                  "mapped_failed_pct": NaN,                 "paired in
                     (right here) ------^

我想创建一个函数来处理此错误。
我希望每次弹出此错误时,都能够在文件夹的所有文件中应用此sed函数。

system(paste("gsed -i 's/NaN/null/g'",paste0(path,"*.json")))

有什么想法吗

kwvwclae

kwvwclae1#

您可以使用此 Package 器:

safe_load_multiqc <- function(path, file) {
  tryCatch(load_multiqc(file.path(path, file)), error = function(e) {
    system(paste("gsed -i 's/NaN/null/g'",paste0(path,"*.json")))
    # retry
    load_multiqc(path, file)
  })
}
vjhs03f7

vjhs03f72#

在工作管道中处理类似错误的一个好方法是使用restart和withCallingHandlerswithRestarts
你建立了条件处理程序和恢复协议(重启),然后你可以选择使用什么协议以及使用的顺序。调用处理程序可以比普通的try-catch更好地控制错误条件。
在这个例子中,我写了两个处理程序:removeNaNs(在文件夹级别工作)和skipFile(在文件级别工作),如果第一个失败,则执行第二个(简单地跳过文件)。
我认为在您的情况下,您可以在任何情况下简单地运行sed,不过,我希望这个答案满足您对规范方法的寻找
灵感和额外讲座:Beyond Exception Handling: Conditions and Restarts

path <- "../your_path"

# function that does the error_prone task
do_task <- function(path){
  files <- dir(path,pattern = "*.json")        #locate files
  files %>% 
    map(~ withRestart(                         # set an alternative restart
      load_multiqc(file.path(path, .)),        # parsing
      skipFile = function() {                  # if fails, skip only this file      
        message(paste("skipping ", file.path(path, .)))
        return(NULL)
      }))   
}

# error handler that invokes "removeNaN"
removeNaNHandler <- function(e)  tryInvokeRestart("removeNaN")
# error handler that invokes "skipFile"
skipFileHandler <- function(e) tryInvokeRestart("skipFile")

# run the task with handlers in case of error
withCallingHandlers(
  condition = removeNaNHandler,    # call handler (on generic error)
  # condition = skipFileHandler,     # if previous fails skips file
  {
    # run with recovery protocols (can define more than one)
    withRestarts({
      do_task(path)},   
      removeNaN = function()   # protocol "removeNaN"  
      {               
        system(paste("gsed -i 's/NaN/null/g'",paste0(path,"*.json")))
        do_task(path)      # try again
      }
    )
  }
)

相关问题