忽略特定的警告,而不是R中的其他警告

时间:2020-02-11 16:20:17

标签: r try-catch warnings

该问题与Disregarding simple warnings/errors in tryCatch类似,但有所不同。我正在从无法控制的外部来源读取Excel文件。在阅读科学计数法时,我经常遇到其他警告之一。由于read_excel文件可以很好地处理这些问题,因此我想忽略这些警告,但显示可能生成的其他任何警告。这是CSV格式的一些数据。

gameTitleArray[Math.floor(Math.random() * gameTitleArray.length)]

让我们说这4列和10行在一个名为“ example.xlsx”的Excel文件中。以下代码将生成4条警告,表明它是“将文本强制转换为数字”,与C,E,G和I行相关。

V1,V2,V3,V4    
A,0,0,Include    
B,0,0,Include     
C,0,-2.0484947071963688E-11,Include    
D,0,-9.1299973,Include    
E,1.8488805068272995E-05,0,Include    
F,0.003399333,0,Include    
G,-9.902539136998455E-05,0,Include    
H,-0.000442444,0,Include    
I,-4.561459166153803E-05,0,Include    
J,-0.00095274,0,Include    

readxl::read_excel("example.xlsx", .name_repair = "unique", col_types = c("guess", rep("numeric", 2), "guess")) 将为4。我想禁止显示此类警告,并传递其他警告(和错误)。如果警告仅属于这种类型(“将文本强制转换为数字”),那么我想返回该函数的结果,因为它将这些值很好地转换了。

我被困在tryCatch上(在withCallingHandlers上迷失了)。 tryCatch函数创建的warning_message似乎仅捕获第一个警告,而不是全部。另外,当只有我要忽略的警告时,我可以返回read_excel函数的结果(而不必再次调用该函数吗?

这是我想要完成的事情的概念。首先,这是一个函数,如果我可以在tryCatch中访问warnings()函数,该函数将有所帮助。

length(warnings()

然后tryCatch可能看起来像这样:

ignoreWarnings <- function(w){    
  for(i in names(w)){    
    if(regexpr("Coercing text to numeric", i) == -1) return(FALSE)   
  }    
  return(TRUE)    
}

在ignoreWarnings为TRUE的情况下,我们返回tryCatch(out <- readxl::read_excel("example.xlsx", .name_repair = "unique", col_types = c("guess", rep("numeric", 2), "guess")), error = function(error_message){ message(error_message) return(NA) }, warning = function(warning_message){ if(ignoreWarnings(warning_message)){ return(out) } else { message(warning_message) return(NA) } } ) ,这是read_excel函数的结果,就好像没有错误或警告一样。如果为假,我们将通过警告并返回NA。

我意识到out与warnings()不同。我似乎无法在tryCatch中访问warnings()。如果只有警告被忽略,最好避免两次调用read_excel。

0 个答案:

没有答案
相关问题