Игнорирование определенных c предупреждений, но не других в R - PullRequest
1 голос
/ 11 февраля 2020

Этот вопрос похож, но отличается от Без учета простых предупреждений / ошибок в 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 дважды в случае, если игнорируются только предупреждения .

...