Как да идентифицирате генерираните предупреждения случаи на операция в цикъл?

Въз основа на това решение, формулирах кода по-долу за изпълнение на chisq.test за 33 променливи.

sapply(Indices,function(i){
  chisq.test(data.cleaned[,i],data.cleaned$Out)$p.value })

Този код генерира 9 предупреждения, надяваме се, че се дължи на нарушението на предположенията, направени за chisq.test. Бих искал да идентифицирам за кои случаи на i се издават предупрежденията?

Предполагам, че няма нужда от възпроизводим пример за този прост въпрос от начинаещ.


person Prradep    schedule 12.06.2015    source източник
comment
Опитайте да поставите print(i) във функция. Не съм сигурен дали предупрежденията се отпечатват след цикъл или при всяка итерация. но можете да опитате   -  person Andriy T.    schedule 12.06.2015


Отговори (2)


Генерирам този пример, за да възпроизведа проблема:

df <- data.frame(x=rep(c("a","b"), 22))

options(warn=1)

sapply(1:nrow(df), function(i){
  df[i,"x"] <- letters[round(rnorm(1,mean=2, sd = .5),0)]
  print (i)
})

с options(warn=1) предупреждение се отпечатва, когато се появи. (от отговор на Андри) И print(i) ми казва на коя итерация то се произвежда.

person Andriy T.    schedule 12.06.2015
comment
Благодаря за възможно най-простия отговор. Чудех се дали е възможно по някакъв начин да се отпечатат само i стойности, когато има предупреждение. Тъй като имам само 33 итерации, не е голяма работа да проверя. Когато има огромен брой итерации, да речем 1000+, ще бъде чиста задача да знаете предупрежденията, издаващи i. - person Prradep; 12.06.2015
comment
Ще се опитам да го открия - person Andriy T.; 12.06.2015
comment
Да, цялото решение, което намерих, е свързано с функцията tryCatch. Мисля, че отговорът на Роланд е по-подходящ - person Andriy T.; 12.06.2015

Можете да използвате tryCatch и да върнете предупредителни съобщения от вашата анонимна функция заедно с chisq.test резултат в list.

Пример:

fun <- function(x) {
  if (x == 2) warning("It's a two!")
  return(x^2)
}
lapply(1:3, function(i) tryCatch(list(result = fun(i), warning = "no warning"),
                                 warning = function(w) list(result = fun(i), 
                                                            warning = as.character(w))))

#[[1]]
#[[1]]$result
#[1] 1
#
#[[1]]$warning
#[1] "no warning"
#
#
#[[2]]
#[[2]]$result
#[1] 4
#
#[[2]]$warning
#[1] "simpleWarning in fun(i): It's a two!\n"
#
#
#[[3]]
#[[3]]$result
#[1] 9
#
#[[3]]$warning
#[1] "no warning"
#
#
#Warning message:
#In fun(i) : It's a two!
person Roland    schedule 12.06.2015
comment
Благодаря за доста контрацептивния отговор. Ще го разбера и ще използвам за моите изисквания. - person Prradep; 12.06.2015