该问题与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。