Как идентифицировать сгенерированные предупреждения экземпляры операции в цикле?

На основе этого решения я сформулировал приведенный ниже код для выполнения 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) печатается, когда это происходит. (из Andrie answer) И 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