Ravi, I have no idea what motivated the people who made ifelse() but there is no reason they felt the need to program it to meet your precise need. As others have noted, it probably was built to handle simple cases well and it expects to return a result that is the same length as the input. If some of the processing returns an NA or a NaN then that is what it probably should return.
What is the alternative? Return a shorter result? Replace it with a zero? Fail utterly and abort the program? YOU as the programmer should make such decisions for a non-routine case. You can create functions with names like wrapperIf() and wrapperElse() and do your ifelse like this: result <- ifelse(condition, wrapperIf(args), wrapperElse(args)) Why the wrappers? If your logic is to replace NaN with 0 or NA or 666 or Inf, then the code for it would invoke your functionality and if tested to be a NaN it would replace it as you wish. Yes, it would slow things down a bit but leave the ifelse() routine fairly simple. If your goal is to remove those entries, you can do it after by manipulating "result" above such as not keeping any item that matches 666, or even without the wrappers, something like: result <- result[!is.nan(result)] But, of course, warnings are only suppressed if done right. Clearly you can very selectively suppress warnings in the wrapper functions above without also suppressing some other more valid warnings. But if the warning is coming from ifelse() itself then not ever having it see a NaN would suppress that. Do note that the implementation of ifelse() is currently a function, not some internal call. You can copy that and make your own slightly modified version if you wish. (no R) Avi -----Original Message----- From: R-help <r-help-boun...@r-project.org> On Behalf Of Ravi Varadhan via R-help Sent: Friday, October 8, 2021 8:22 AMiu To: John Fox <j...@mcmaster.ca>l Cc: R-Help <r-help@r-project.org> Subject: Re: [R] How to use ifelse without invoking warnings Thank you to Bert, Sarah, and John. I did consider suppressing warnings, but I felt that there must be a more principled approach. While John's solution is what I would prefer, I cannot help but wonder why `ifelse' was not constructed to avoid this behavior. Thanks & Best regards, Ravi ________________________________ From: John Fox <j...@mcmaster.ca> Sent: Thursday, October 7, 2021 2:00 PM To: Ravi Varadhan <ravi.varad...@jhu.edu> Cc: R-Help <r-help@r-project.org> Subject: Re: [R] How to use ifelse without invoking warnings External Email - Use Caution Dear Ravi, It's already been suggested that you could disable warnings, but that's risky in case there's a warning that you didn't anticipate. Here's a different approach: > kk <- k[k >= -1 & k <= n] > ans <- numeric(length(k)) > ans[k > n] <- 1 > ans[k >= -1 & k <= n] <- pbeta(p, kk + 1, n - kk, lower.tail=FALSE) > ans [1] 0.000000000 0.006821826 0.254991551 1.000000000 BTW, I don't think that you mentioned that p = 0.3, but that seems apparent from the output you showed. I hope this helps, John -- John Fox, Professor Emeritus McMaster University Hamilton, Ontario, Canada web: https://nam02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fsocialscie nces.mcmaster.ca%2Fjfox%2F&data=04%7C01%7Cravi.varadhan%40jhu.edu%7Cfd88 2e7c4f4349db34e108d989bc6a9f%7C9fa4f438b1e6473b803f86f8aedf0dec%7C0%7C0%7C63 7692265160038474%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzI iLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C2000&sdata=Q33yXm36BwEVKUWO72CWFpSUx7g cEEXhM3qFi7n78ZM%3D&reserved=0 On 2021-10-07 12:29 p.m., Ravi Varadhan via R-help wrote: > Hi, > I would like to execute the following vectorized calculation: > > ans <- ifelse (k >= -1 & k <= n, pbeta(p, k+1, n-k, lower.tail = > FALSE), ifelse (k < -1, 0, 1) ) > > For example: > > >> k <- c(-1.2,-0.5, 1.5, 10.4) >> n <- 10 >> ans <- ifelse (k >= -1 & k <= n, pbeta(p,k+1,n-k,lower.tail=FALSE), >> ifelse (k < -1, 0, 1) ) > Warning message: > In pbeta(p, k + 1, n - k, lower.tail = FALSE) : NaNs produced >> print(ans) > [1] 0.000000000 0.006821826 0.254991551 1.000000000 > > The answer is correct. However, I would like to eliminate the annoying warnings. Is there a better way to do this? > > Thank you, > Ravi > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://nam02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fstat > .ethz.ch%2Fmailman%2Flistinfo%2Fr-help&data=04%7C01%7Cravi.varadha > n%40jhu.edu%7Cfd882e7c4f4349db34e108d989bc6a9f%7C9fa4f438b1e6473b803f8 > 6f8aedf0dec%7C0%7C0%7C637692265160048428%7CUnknown%7CTWFpbGZsb3d8eyJWI > joiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C2000&a > mp;sdata=FXX%2B4zNT0JHBnDFO5dXBDQ484oQF1EK5%2Fa0dG9P%2F4k4%3D&rese > rved=0 PLEASE do read the posting guide > https://nam02.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.r > -project.org%2Fposting-guide.html&data=04%7C01%7Cravi.varadhan%40j > hu.edu%7Cfd882e7c4f4349db34e108d989bc6a9f%7C9fa4f438b1e6473b803f86f8ae > df0dec%7C0%7C0%7C637692265160048428%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC > 4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C2000&sd > ata=ss2ohzJIY6qj0eAexk4yVzTzbjXxK5VZNors0GpsbA0%3D&reserved=0 > and provide commented, minimal, self-contained, reproducible code. > [[alternative HTML version deleted]] ______________________________________________ R-help@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. ______________________________________________ R-help@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.