Этот вопрос похож, но отличается от Без учета простых предупреждений / ошибок в tryCatch . Я читаю файл Excel из внешнего источника, который я не могу контролировать. Я часто сталкиваюсь с одним из предупреждений, когда он читает нотацию scientifi c. Поскольку файл read_excel хорошо их обрабатывает, я бы хотел игнорировать эти предупреждения, но отображать любые другие, которые могут быть сгенерированы. Вот некоторые данные в формате CSV.
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
Допустим, эти 4 столбца и 10 строк находятся в файле Excel с именем example.xlsx. Следующий код сгенерирует 4 предупреждения о том, что это «Приведение текста к цифре c», которое относится к строкам C, E, G и I, находящимся в научной нотации c.
readxl::read_excel("example.xlsx", .name_repair = "unique",
col_types = c("guess",
rep("numeric", 2),
"guess"))
length(warnings()
будет 4. Я хотел бы подавить предупреждения этого типа и пропустить другие предупреждения (и ошибки). Если предупреждения относятся только к этому типу («Приведение текста к цифре c»), то я хочу вернуть результаты функции, потому что она преобразует эти значения точно.
Я застрял на tryCatch (и потерял на withCallingHandlers). Warning_message, созданное функцией tryCatch, похоже, перехватывает только первое предупреждение, а не все. Кроме того, когда есть только предупреждение, которое я хочу игнорировать, могу ли я вернуть результаты функции read_excel (без необходимости повторного вызова функции?
Вот концепция того, что я хотел бы contribli sh. Во-первых, вот функция, которая помогла бы, если бы я мог получить доступ к функции warnings () в tryCatch.
ignoreWarnings <- function(w){
for(i in names(w)){
if(regexpr("Coercing text to numeric", i) == -1) return(FALSE)
}
return(TRUE)
}
Тогда tryCatch может выглядеть так:
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)
}
}
)
В случае, если ignoreWarnings равен TRUE, мы возвращаем out
, который является результатом функции read_excel, как если бы не было ошибок или предупреждений. Если FALSE, мы пропускаем предупреждения и возвращаем NA.
I Я понимаю, что warning_message
отличается от предупреждений (). Мне кажется, что я не могу получить доступ к предупреждениям () в tryCatch. Было бы неплохо избегать вызова read_excel дважды в случае, если игнорируются только предупреждения .