I believe there is an error in the summary.warnings function (typically called via 'summary(warnings())'). Below is a minimal working example: ######### testfunction <- function(x){ if(x > 30){ warning("A big problem (should be 20 of these)") }else{ warning("Bigger problem (should be 30 of these)") } } for(i in 1:50){ testfunction(i) } summary(warnings()) ######### I checked the code for summary.warnings: function (object, ...) { msgs <- names(object) calls <- as.character(object) ss <- ": " c.m. <- paste(calls, msgs, sep = ss) if (length(i.no.call <- which(calls == "NULL"))) c.m.[i.no.call] <- substr(c.m.[i.no.call], nchar(paste0("NULL", ss)) + 1L, 100000L) tm <- table(c.m., deparse.level = 0L) structure(unique(object), counts = as.vector(tm), class = "summary.warnings") } The problem appears to be in the last line: unique preserves the order of the input, but counts reflects the counts in the table tm, which is a problem because table names are in alphabetical order. Am I missing something? Allison ---------- Allison Meisner, PhD Postdoctoral Fellow Department of Biostatistics Johns Hopkins Bloomberg School of Public Health 615 N. Wolfe Street Baltimore, MD 21205 [[alternative HTML version deleted]]
>>>>> Allison Meisner >>>>> on Thu, 7 May 2020 19:32:36 +0000 writes:> I believe there is an error in the summary.warnings function (typically called via 'summary(warnings())'). Below is a minimal working example: > ######### > testfunction <- function(x){ > if(x > 30){ > warning("A big problem (should be 20 of these)") > }else{ > warning("Bigger problem (should be 30 of these)") > } > } > for(i in 1:50){ > testfunction(i) > } > summary(warnings()) > ######### > I checked the code for summary.warnings: > function (object, ...) > { > msgs <- names(object) > calls <- as.character(object) > ss <- ": " > c.m. <- paste(calls, msgs, sep = ss) > if (length(i.no.call <- which(calls == "NULL"))) > c.m.[i.no.call] <- substr(c.m.[i.no.call], nchar(paste0("NULL", > ss)) + 1L, 100000L) > tm <- table(c.m., deparse.level = 0L) > structure(unique(object), counts = as.vector(tm), class = "summary.warnings") > } > The problem appears to be in the last line: unique preserves the order of the input, but counts reflects the counts in the table tm, which is a problem because table names are in alphabetical order. > Am I missing something? No -- I think you are perfect and I was very imperfect ;-) when I created and tested the function .. This will be fixed in the next versions of R. Thank you very much for the report and the nice concise reproducible example! Best regards, Martin > Allison > ---------- > Allison Meisner, PhD > Postdoctoral Fellow > Department of Biostatistics > Johns Hopkins Bloomberg School of Public Health > 615 N. Wolfe Street > Baltimore, MD 21205 Martin Maechler ETH Zurich and R Core team
>>>>> Martin Maechler >>>>> on Fri, 8 May 2020 17:37:29 +0200 writes:>>>>> Allison Meisner >>>>> on Thu, 7 May 2020 19:32:36 +0000 writes:> I believe there is an error in the summary.warnings function (typically called via 'summary(warnings())'). Below is a minimal working example: > ######### > testfunction <- function(x){ > if(x > 30){ > warning("A big problem (should be 20 of these)") > }else{ > warning("Bigger problem (should be 30 of these)") > } > } > for(i in 1:50){ > testfunction(i) > } > summary(warnings()) > ######### > I checked the code for summary.warnings: > function (object, ...) > { > msgs <- names(object) > calls <- as.character(object) > ss <- ": " > c.m. <- paste(calls, msgs, sep = ss) > if(length(i.no.call <- which(calls == "NULL"))) > c.m.[i.no.call] <- substr(c.m.[i.no.call], > nchar(paste0("NULL", ss))+1L, 100000L) > tm <- table(c.m., deparse.level = 0L) > structure(unique(object), counts = as.vector(tm), class = "summary.warnings") > } >> The problem appears to be in the last line: unique preserves the order of the input, but counts reflects the counts in the table tm, which is a problem because table names are in alphabetical order. I've committed the fix. If you are interested, I've replaced the last 2 lines with i.uniq <- which(!duplicated(object, incomparables=FALSE)) tm <- table(factor(c.m., levels=c.m.[i.uniq]), deparse.level=0L) structure(object[i.uniq], counts = as.vector(tm), class = "summary.warnings") which (at least conceptually) should even be faster the previous code. Thank you again, Martin >> Am I missing something? > No -- I think you are perfect and I was very imperfect ;-) when > I created and tested the function .. > This will be fixed in the next versions of R. > Thank you very much for the report and the nice concise > reproducible example! > Best regards, > Martin >> Allison >> ---------- >> Allison Meisner, PhD >> Postdoctoral Fellow >> Department of Biostatistics >> Johns Hopkins Bloomberg School of Public Health >> 615 N. Wolfe Street >> Baltimore, MD 21205 > Martin Maechler > ETH Zurich and R Core team > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.